티스토리 뷰


백준 #9536 여우는 어떻게 울지?

 

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

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

www.acmicpc.net

🔒 문제 설명

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

 

⌨️ 입력

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

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

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

 

🖥️ 출력

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

 


🗝️Solution

String과 배열에 대한 이해도만 적당히 있다면 쉽게 풀 수 있는 문제이다. 중요한 포인트는 아래 두 가지이다.

 

[1] StringTokenizer를 사용해서 BufferedReader에게 입력받은 문자열을 띄어쓰기를 기준으로 분리해서 array에 담는 것이다.

그렇게 되면 array[2]에 각 동물들의 울음소리가 저장된다.

 

[2] 이제 여러 동물들이 섞인 울음소리 ArrayList 'sounds'에서 여우가 아닌 다른 동물들의 울음소리를 삭제해줘야 한다. 

이때 ArrayList의 'remove'를 사용하면 일치하는 '하나의 요소'만 삭제된다. 하지만 우리가 원하는 것은 해당 동물의 울음소리를 sounds에서 모두 제거하는 것이기 때문에 'removeAll'을 사용해줘야 한다. 

 

public boolean removeAll(Collection<?> c)

 

removeAll()은 매개변수로 넘겨준 Collection 객체에 담긴 element를 모두 삭제한다. 이때, animals.get(i).get(2)는 String이지 Collection이 아니므로 Arrays.asList로 변환해서 파라미터에 넣어주었다.

 

for(int i = 0; i<animals.size(); i++){ 
	sounds.removeAll(Arrays.asList(animals.get(i).get(2)));
}

해당 메서드를 사용해서 animals 리스트에 있는 울음소리들을 순회하며 sounds 리스트에 해당 요소를 삭제해 주었다.

 

 

전체 코드는 아래와 같다

🦊

 

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

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int T = Integer.parseInt(br.readLine());

        for(int t = 0; t < T; t++){

            String input;
            ArrayList<ArrayList<String>> animals = new ArrayList<>();
            ArrayList<String> sounds = new ArrayList<>();

            //[1] 울음 소리는 sound 리스트에 저장하기
            input = br.readLine();
            StringTokenizer st = new StringTokenizer(input);

            while(st.hasMoreTokens()){
                sounds.add(st.nextToken());
            }


            //[2] 입력 받아서 '띄어쓰기' 단위로 분리해서 sounds 1차원 배열에 저장
            while((input = br.readLine())!=null){

                if(input.equals("what does the fox say?")) break;

                ArrayList<String> array = new ArrayList<>();
                st = new StringTokenizer(input);

                while(st.hasMoreTokens()){
                    array.add(st.nextToken());
                }
                animals.add(array);

            }


            //[3] animals의 울음소리는 sounds에서 제거하기
            for(int i = 0; i<animals.size(); i++){
                //System.out.println(animals.get(i).get(0)+" : "+animals.get(i).get(2));
                sounds.removeAll(Arrays.asList(animals.get(i).get(2)));
            }

            for(String s : sounds){
                System.out.print(s + " ");
            }
            System.out.println();
        }
    }

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함