본문 바로가기
백준

[백준] 16165번 : 걸그룹 마스터 준석 – JAVA [자바]

by Hongwoo 2023. 7. 31.
반응형

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

 

16165번: 걸그룹 마스터 준석이

정우는 소문난 걸그룹 덕후이다. 정우의 친구 준석이도 걸그룹을 좋아하지만 이름을 잘 외우지 못한다는 문제가 있었다. 정우는 친구를 위해 걸그룹 개인과 팀의 이름을 검색하여 외우게 하는

www.acmicpc.net

 


  • 문제

 

 


  • 문제 풀이

백준 16165번 걸그룹 마스터 준석이는 실버 3 난이도의 자료 구조 및 해시 문제이다. 이 문제에서는 걸그룹의 수 N개와 퀴즈 M개가 주어진다. 이때 퀴즈의 종류가 1이면 멤버의 이름이 주어지고 이 멤버가 속한 걸그룹의 이름을 출력하면 된다. 퀴즈의 종류가 0이면 팀의 이름이 주어지고 이 팀에 속해있는 멤버들의 이름들을 출력하면 된다.

 

이 문제는 해시맵을 이용해서 풀 수 있다. 해시맵의 키는 그룹의 이름, 즉 String을 저장할 것이고 그리고 해시맵의 값으로는 그룹의 속해 있는 멤버들의 이름, 즉 리스트를 저장할 것이다.

 

우선, 팀의 이름과 이 팀에 속해 있는 멤버들을 입력받고 이 값들을 해시맵에 저장해 준다.

 

퀴즈의 종류는 두 가지가 있다. 퀴즈의 종류가 1이면, 멤버의 이름이 주어진다. 이때는 map.keySet()을 하면 해시맵의 키들을 받을 수 있다. 이 키는 그룹의 이름이고 만약 map.get(group).contains(member)를 했을 때 true이면 이 그룹에 멤버가 있다는 뜻이므로 이 그룹의 이름을 출력하면 된다.

 

또 다른 퀴즈의 종류는 0일 때다. 퀴즈의 종류가 0이면, 그룹 이름이 주어진다. 이 때는 map.get(name)을 하면 List <String>을 받는다. 이때, 이 리스트를 사전순으로 정렬을 해주고 이 리스트에 있는 멤버 이름들을 출력해 주면 된다.

 

자세한 코드는 아래에 있는 코드를 참고하면 되겠다.

 


  • 코드

 

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken()); // 걸그룹의 수 N
        int m = Integer.parseInt(st.nextToken()); // 퀴즈의 수 M
        Map<String, List<String>> map = new HashMap<>(); // 걸그룹 정보를 저장할 Map

        // 각 걸그룹 정보를 입력받고 map에 저장
        for (int i = 0; i < n; i++) {
            String group = br.readLine(); // 팀의 이름
            int num = Integer.parseInt(br.readLine()); // 걸그룹의 인원 수
            List<String> list = new ArrayList<>(); // 멤버의 이름을 저장할 List
            for (int j = 0; j < num; j++) {
                list.add(br.readLine()); // 멤버의 이름을 List에 추가
            }
            map.put(group, list); // 팀의 이름과 멤버 목록을 map에 저장
        }
        StringBuilder sb = new StringBuilder(); // 출력 결과를 저장할 StringBuilder

        // M개의 퀴즈에 대한 답을 처리
        for (int i = 0; i < m; i++) {
            String name = br.readLine(); // 퀴즈에 해당하는 팀의 이름 또는 멤버의 이름
            int member = Integer.parseInt(br.readLine()); // 퀴즈의 종류 (0 또는 1)

            if (member == 1) { // 퀴즈의 종류가 1일 경우 (멤버 이름으로 팀 찾기)
                for (String group : map.keySet()) { // 모든 팀을 순회하며
                    if (map.get(group).contains(name)) { // 해당 멤버가 포함되어 있는 팀을 찾음
                        sb.append(group + "\n"); // 해당 팀의 이름을 출력 결과에 추가
                        break;
                    }
                }
            } else { // 퀴즈의 종류가 0일 경우 (팀 이름으로 멤버 찾기)
                List<String> list = map.get(name); // 해당 팀의 멤버 목록을 가져옴
                Collections.sort(list); // 멤버 이름을 사전순으로 정렬
                for (String memberName : list) { // 모든 멤버를 순회하며
                    sb.append(memberName + "\n"); // 멤버의 이름을 출력 결과에 추가
                }
            }
        }

        System.out.println(sb); // 출력 결과 출력

    }

}

 

 

반응형

댓글