16165 걸그룹 마스터 준석이

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

문제설명

  1. 팀 이름을 주면 해당 팀의 멤버들을 오름차순으로 정렬하여 출력한다.
  2. 멤버 이름을 주면 그 멤버가 속한 팀의 이름을 출력한다.

각 팀은 여러 멤버를 가질 수 있으며, 멤버는 오직 하나의 팀에만 속할 수 있다.

접근방식

O(N * M + M * log M) 시간복잡도

  •  N은 팀의 수, M은 각 팀의 평균 멤버 수만큼 O(N * M)를 입력받는다.
  • 각 팀의 멤버를 정렬하면 O(M * log M) 시간복잡도가 소요된다.
  • O(M) M은 쿼리의 수이다.

문제 조건 분석 과정

 

  • 입력:
    • 첫 줄에서 팀의 수 NN과 쿼리의 수 MM을 입력받는다.
    • 각 팀의 정보 (팀 이름과 팀 멤버 수), 그리고 팀의 멤버 이름을 입력받는다.
    • 각 쿼리는 팀 이름 또는 멤버 이름과 쿼리 유형(0 또는 1)을 포함한다.
  • 데이터 구조:
    • HashMap<String, ArrayList<String>>: 팀 이름을 키로, 해당 팀의 멤버 목록을 값으로 저장한다.
    • HashMap<String, String>: 멤버 이름을 키로, 해당 멤버가 속한 팀 이름을 값으로 저장한다.
  • 쿼리 처리:
    • 쿼리 유형이 0인 경우: 주어진 팀 이름으로 팀의 멤버 목록을 가져와 정렬한 후 출력한다.
    • 쿼리 유형이 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));

        StringTokenizer st = new StringTokenizer(br.readLine());
        StringBuilder sb = new StringBuilder();

        int n = Integer.parseInt(st.nextToken()); //팀의 수
        int m = Integer.parseInt(st.nextToken()); //멤버 이름

        //key: 팀 이름 value: 팀 멤버 리스트
        HashMap<String, ArrayList<String>> mem = new HashMap<>();
        //key: 멤버 이름 value: 팀 이름
        HashMap<String, String> team = new HashMap<>();

        //팀 정보 입력
        for (int i = 0; i < n; i++) {

            ArrayList<String> members = new ArrayList<>();

            //팀 이름
            String teamName = br.readLine();
            //팀 멤버 수
            int memberCount = Integer.parseInt(br.readLine());

            //각 팀의 멤버를 members list에 추가하여 team맵에 멤버와 팀 매핑
            for (int j = 0; j < memberCount; j++) {
                String memberName = br.readLine();
                members.add(memberName);
                team.put(memberName, teamName); // 멤버와 팀 매핑
            }
            //key: 팀 이름 value: 멤버 리스트 에 저장
            mem.put(teamName, members); // 팀과 멤버 매핑
        }

        for (int i = 0; i < m; i++) {
            String query = br.readLine();
            String type = br.readLine();

            //쿼리가 0인 경우: 팀 멤버를 정렬하여 출력
            if (type.equals("0")) {
                //key: 팀 이름
                ArrayList<String> members = mem.get(query);
                //멤버 리스트를 오름차순으로 정렬
                Collections.sort(members);
                //정렬된 멤버 리스트를 sb에 추가
                for (String member : members) {
                    sb.append(member).append("\n");
                }
                //1인 경우 멤버의 소속팀 출력
            } else if (type.equals("1")) {
                //멤버 이름을 키로 사용
                sb.append(team.get(query)).append("\n");
            }
        }

        System.out.print(sb);
    }
}

 

'자료구조 > 문제풀이' 카테고리의 다른 글

[백준 JAVA] 21921 블로그  (0) 2024.08.01
[백준 JAVA] 17276 배열 돌리기  (0) 2024.08.01
[백준 JAVA] 14916 거스름돈  (0) 2024.08.01
[백준 JAVA] 13305 주유소  (0) 2024.08.01
[백준 JAVA] 11047 동전  (0) 2024.08.01

+ Recent posts