본문 바로가기

문제 풀이/Baekjoon

[백준] S4 9536번 여우는 어떻게 울지? (JAVA)

문제 출처 - Baekjoon Online Judge

문제는 여기

 

9536번: 여우는 어떻게 울지?

각 테스트케이스마다 여우의 울음소리를 한 줄씩, 녹음된 순서대로 출력한다. 여우의 울음소리가 녹음되어 있음이 보장된다. (알려진 것과는 달리, 여우는 모스 부호로 의사소통하지 않는다.)

www.acmicpc.net

[문제] 

고대 미스테리로 전해지는 여우의 울음소리를 밝혀내기 위해 한신이는 고성능 녹음기로 무장하고 숲으로 들어갔다. 하지만 숲에는 동물들이 가득해, 녹음된 음성에는 다른 동물들의 울음소리가 섞여 있다. 그러나 한신이는 철저한 준비를 해 왔기 때문에 다른 동물들이 어떤 울음소리를 내는지 정확히 알고 있다. 그러므로 그 소리를 모두 걸러내면 남은 잡음은 분명히 여우의 울음소리일 것이다.

[입력]

첫 번째 줄에는 테스트케이스의 개수 T가 입력된다. 각 테스트케이스는 아래와 같이 구성되어 있다.

테스트케이스의 첫 줄에는 몇 개의 단어로 이루어진 녹음된 소리가 입력된다. 단어는 알파벳 소문자로만 이루어져 있으며 공백으로 구분된다. 단어의 길이는 최대 100글자이고, 단어의 개수는 최대 100개이다. 다음 줄부터는 여우를 제외한 동물들의 울음소리가 <동물> goes <소리>의 형태로 입력된다. 최소 1마리, 최대 100마리이며, 이름은 최대 100글자이고 실제로 존재하는 동물의 이름이다. 여우를 제외한 동물의 울음소리는 한 단어이고 최대 100글자이다.

마지막 줄에는 한신이가 알고 싶어하는 질문이 주어진다. what does the fox say?

[출력]

각 테스트케이스마다 여우의 울음소리를 한 줄씩, 녹음된 순서대로 출력한다. 여우의 울음소리가 녹음되어 있음이 보장된다. (알려진 것과는 달리, 여우는 모스 부호로 의사소통하지 않는다.)

 

 


[풀이]

1. 각 동물의 울음소리를 <동물, 울음소리>로 맵에 저장해준다.

2. 울음소리를 출력하면서 1에서 저장한 맵과 비교를 해 겹치지 않는다면 출력해준다.

[접근]

1. 각 동물들의 울음소리를 모든 울음소리들에서 제거해줘야 하는 문제라는 것을 파악했다.

2. 각 동물의 울음소리를 저장하기 위해서 여러 가지를 생각했는데 맵을 사용 해서 하면 좋을 것 같다고 생각하였다.

[코드]

package BOJ_silver;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;

public class Main_S4_9536 {
	static int n;
	static String str;
	static HashMap<String, String> animal = new HashMap();
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		n = Integer.parseInt(br.readLine());
		
		for(int i = 0; i < n; i++) {
			str = br.readLine(); // 동물들의 섞인 울음소리
			String[] sounds = str.split(" "); // 울음소리들을 잘라서 배열에 담기
			
			while(true) {
				String word = br.readLine(); // 각 동물의 울음소리 담기
				String[] wordTokens = word.split(" "); // 어떤 동물의 울음소리인지 알기 위해 자르기
				
				// 만약 2번째 단어가 goes가 아니라면 (그럼 울음소리를 받는것이 아니므로 종료)
				if(!wordTokens[1].equals("goes")) {
					break;
				}else { // 동물, 울음소리로 해시맵에 저장
					animal.put(wordTokens[0], wordTokens[2]);
				}
			}
			
			// 사운드들의 길이만큼
			for(int j = 0; j < sounds.length; j++) {
				// 만약 맵에 저장되어 있는 소리가 아니라면
				if(!animal.containsValue(sounds[j])) {
					// 해당 소리를 출력
					System.out.print(sounds[j] + " ");
				}
			}
			System.out.println();
		}
	}
}