안녕하세요. 회사와 함께 성장하고 싶은 KOSE입니다.

이번 포스팅은 백준 문자열 문제 - 여우는 어떻게 울지? 자바 풀이를 진행하도록 하겠습니다.

문제 출처: https://www.acmicpc.net/problem/9536

 

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

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

www.acmicpc.net

 

1. 풀이 소스

 

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

public class Main {
    public static void main(String[] args) throws IOException {
        
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());
        StringBuilder sb = new StringBuilder();
        
        for (int i = 0; i < T; i++) {
            HashMap<String, ArrayList<Integer>> map = new HashMap<>();
            String[] saying = br.readLine().split(" "); // 울음소리 저장

            for (int c = 0; c < saying.length; c++) {
                if (!map.containsKey(saying[c])) map.put(saying[c], new ArrayList<>(List.of(c))); //키 파악
                else map.get(saying[c]).add(c); // 키 있다면 list에 저장
            }

            String str;
            while((str = br.readLine()) != null && !str.equals("what does the fox say?")) {
                String[] strArr = str.split(" ");
                String sound = strArr[strArr.length - 1];
                List<Integer> list = map.get(sound);
                for (Integer num : list) saying[num] = ""; // 울음 소리가 저장된 인덱스 찾아서 "" 만들기
            }

            for (String say : saying) {
                if (say != null && !say.equals("")) sb.append(say).append(" "); // null이 아니고 ""가 아니라면 울음 소리 저장
            }
            sb.append("\n");
        }
        
        System.out.print(sb);
    }
}

 

2. 풀이 중점 사항

 

HashMap<String, ArrayList<Integer>> map = new HashMap<>();
String[] saying = br.readLine().split(" "); // 울음소리 저장

for (int c = 0; c < saying.length; c++) {
    if (!map.containsKey(saying[c])) map.put(saying[c], new ArrayList<>(List.of(c))); //키 파악
    else map.get(saying[c]).add(c); // 키 있다면 list에 저장
}

 

울음소리는 계속 반복되므로, HashMap에 울음소리와 울음소리의 인덱스를 저장할 ArrayList<>을 key - value로 설정하여 값을 저장하였습니다.

 

정해진 개수만큼 입력을 받는 것이 아닌, EOF 혹은 특정 문자열 입력을 받으면 종료하는 로직을 작성해야할 때가 있습니다.

String str;
while((str = br.readLine()) != null && !str.equals("what does the fox say?")) {
}

 

이 경우, str에 br.readLine() 값을 할당했을 때, 그 값이 null이 아니고, 필요로 하는 문자열이 아닌 경우에만 입력을 계속 받을 수 있도록 처리하였습니다.

 

이상으로 여우는 어떻게 울지? 풀이를 마치도록 하겠습니다. 감사합니다.!

+ Recent posts