티스토리 뷰

1. 문제

https://www.acmicpc.net/problem/19948

 

19948번: 음유시인 영재

감수성이 뛰어난 음유시인 영재는 일상생활 중에 번뜩 시상이 떠오르곤 한다. 하지만 기억력이 좋지 못한 영재는 시상이 떠오르면 그 순간 컴퓨터로 기록해야만 안 까먹는다! 시는 대문자, 소

www.acmicpc.net


 

2. 문제 이해

본문 그대로 조건만 캐치해서 풀면 된다.

조건

1. 시는 대, 소문자, 공백 ( 대문자!= 소문자 )

2. 단어들의 첫 글자를 대문자 바꾸고 제목에 저장하기

3. 같은 문자 여러개일 경우 aaaaa -> a로 생각하고, Aaaa -> Aa라고 생각해야 한다 (1번 조건)

4. 알파벳을 누를 수 있는 횟수에다가 해당 문자마다 -1 해주는데,  같은 문자 일 경우에는 총 -1번 해주기

ex)

aaa vVv

a는 -1번만 깎고, v는 3번 깎아야 한다.

5. 제목을 다 완성하고, 제목에 해당되는 애들도 작성할 수 있는지 판단해주기 ( 횟수에서 빼주기)

 


+ 100%에서 왜 틀려... 아니 틀린 이유: 같은 애들 그냥 안 깎아줌, 제목 + 내용이라는 거....!!!!! (100% 가서 틀림.. 바보 멍청이)

 

3. 풀이 방법

1. map에 알파벳 a -z까지 횟수 넣어줬음 (key는 알파벳, value는 횟수) -> 알파벳은 소문자로 넣어줌

2. 제목은 StringBuilder에 넣어줄 거임

3. 입력받은 시. legnth  돌면서  조건에 맞게 뺴줬음( getOrDefault() 사용해서 있으면 -1  이렇게 해줬음)

4. String이면 String, Character이면 Character로 바꿔주기!! 하나로만 해주기 

그리고 Character로 이용하였고 (이용한 이유: 'a'+i 해서 알파벳을 쉽게 넣어주려고) 나는 소문자로 바꿔줘서 비교해줬음 

5. map.get( key) -> 해당 횟수가 0보다 작을 경우엔 -1 출력하고 return 해줬음

6. 마지막에 꼭 제목도 똑같이 계산해줘야 함!!!! 까먹지 말긔!!!!!!!!!!

 

4. 코드

package net.acmicpc.solution;

import java.io.*;
import java.util.*;

public class Solution_19948_음유시인영재 {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		char[] ch = br.readLine().toCharArray();

		char tmp = ch[0];
		Map<Character, Integer> map = new HashMap<>();

		map.put(' ', Integer.parseInt(br.readLine()));
		StringTokenizer st = new StringTokenizer(br.readLine());
		for (int i = 0; i < 26; i++) {
			map.put((char) ('a' + i), Integer.parseInt(st.nextToken()));
		}

		// System.out.println(map);

		StringBuilder sb = new StringBuilder();
		sb.append(Character.toString(tmp).toUpperCase());
		map.put(Character.toLowerCase(tmp), map.getOrDefault(Character.toLowerCase(tmp), 0) - 1);

		for (int i = 1; i < ch.length; i++) {
			if (ch[i] != tmp) {
				map.put(Character.toLowerCase(ch[i]), map.getOrDefault(Character.toLowerCase(ch[i]), 0) - 1);

				if (tmp == ' ') {
					sb.append(Character.toString(ch[i]).toUpperCase());
				}
			}

			if (map.get(Character.toLowerCase(ch[i])) < 0) {
				System.out.println(-1);
				return;
			}

			tmp = ch[i];
		}

		for (int i = 0; i < sb.length(); i++) {
			char c = Character.toLowerCase(sb.toString().charAt(i));

			map.put(c, map.getOrDefault(c, 0) - 1);

			if (map.get(c) < 0) {
				System.out.println(-1);
				return;
			}
		}
		System.out.println(sb.toString());
	}
}

 

5. 회고

진짜 챙피하지만.. 5번의 실패를 끝에 문제를 풀었다... 진짜......

그 이유는 문제 자체는 어렵지 않은데..... 내가 문제를 꼼꼼히 안 본 탓이라고 생각한다. 

또한, 성격 급한 나는 어떻게 풀 건지 조건만 정리되면 바로 코드 구현하기 바빴기 때문에...(결정적..)

실버 3 너무 만만하게 봤다.. 미안해.. 앞으로 꼼꼼히 보자.. 수민아.. 하하....

 

 

피드백은 언제나 환영입니다 :) 🌳

댓글