티스토리 뷰

728x90
반응형

문제 요약

  • 알고리즘 분류:  해시
  • 난이도: Silver3
  • 문제내용:
    •  N개의 걸그룹 수와 M개의 문제 수가 주어 진다.
    • 걸그룹은 팀 이름, 인원수 맴버 이름을 차례대로 입력한다.
    • M개의 문제가 주어 지는데 팀 이름이나 맴버 이름을 주어 지고 팀 이름이면 맴버 전체 이름을 출력하고 맴버 이름이 주어지면 팀 이름을 출력한다.
  • 사이트: https://www.acmicpc.net/problem/16165
 

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

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

www.acmicpc.net

문제풀이

해시 자료 구조를 활용한 팀 및 멤버 관리 프로그램 구현

해시(key-value)를 활용하여 팀과 멤버를 효과적으로 관리하는 문제에 대한 해결 방법을 살펴보겠습니다. 이 문제는 Python에서는 dictionary, Java에서는 Map과 같은 자료 구조를 활용하여 해결할 수 있습니다.

구현 단계:

  1. 팀과 멤버를 저장하는 해시 자료 구조, 그리고 멤버와 팀을 연결하는 해시 자료 구조 2개를 선언합니다.
  2. 팀명을 입력받을 때, 팀과 멤버 해시 자료 구조를 리스트로 초기화합니다.
  3. 멤버 이름을 입력받을 때, 팀과 멤버 해시 자료 구조에 추가하고, 멤버와 팀 해시 자료 구조에는 상호 연결하여 저장합니다.
  4. 모든 맴버 이름이 저장된 후에는 팀-멤버 해시 자료 구조를 리스트 오름차순으로 정렬합니다.
  5. 문제 해결 단계에서 0을 입력받으면 모든 멤버 이름을 출력하고, 1을 입력받으면 특정 팀명을 출력합니다.

 이러한 구현 과정을 통해 간편하게 프로그램을 완성할 수 있습니다. 프로그래밍 언어에 따라 다르게 표현될 수 있지만, 위의 순서대로 진행하면 문제를 해결하는 데 큰 어려움이 없을 것으로 예상됩니다.

 

 

Code

Python

 if int(input()): 구문에서 if에서 0이면 false이고 그 외는 true로 인식한다. 

print('\n'.join(group[keyword])): 구문에서 list안에 값 사이에 \n을 붙어 줘서 출력해준다.

group = {} # 아이돌 group
idol = {} # 아이돌 소속

N, M = map(int, input().split())

# 아이돌 그룹 세팅
for _ in range(N):
    groupName = input()
    group[groupName] = [] # 아이돌 그룹 초기화
    for _ in range(int(input())):
        idolName = input()
        group[groupName].append(idolName)
        idol[idolName] = groupName
    group[groupName] = sorted(group[groupName]) # 그룹 멤버 이름 정렬

for _ in range(M):
    keyword = input()
    # 1 일때 소속 그룹 출력 나머지는 그룹 맴버 출력
    if int(input()):
        print(idol[keyword])
    else:
        print('\n'.join(group[keyword]))

 

Java

 group.get(GroupName).sort(Comparator.naturalOrder()); : 리스트 정렬할때 sort 메소드 안에 Comparator.naturalOrder() 메소드를 사용 해야 오름차순으로 정렬 한다.

group.get(keyword).stream().forEach(System.out::println);

 forEach(member -> System.out.println(member))를 System.out::println로 줄었다고 보면 된다. 

System.out::println는 메소드 참조(Method Reference)로, 해당 메소드를 참조하여 람다 표현식을 단축시킨 것이다. 즉, System.out.println(member)를 System.out::println로 줄여 표현한 것이며, Stream에서 제공하는 기능 중 하나입니다. 이렇게 간단하게 표현할 수 있다.

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

public class Main {

	public static void main(String[] args) throws IOException {

		Map<String, List<String>> group = new HashMap<>(); // 아이돌 group
		Map<String, String> idol = new HashMap<>(); // 아이돌 소속

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int N = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());

		int numberMember; // 인원 수
		String GroupName; // 아이돌 그룹 명
		String idolName; // 아이돌 이름

		// 아이돌 그룹 세팅 작업
		for (int i = 0; i < N; i++){
			GroupName = br.readLine();
			numberMember = Integer.parseInt(br.readLine());
			group.put(GroupName, new ArrayList<String>()); // 그룹 초기화
			for(int j = 0; j < numberMember; j++){
				idolName = br.readLine();
				group.get(GroupName).add(idolName); // 그룹 맴버 추가
				idol.put(idolName, GroupName); // 아이돌 소속 그룹 추가

			}
			group.get(GroupName).sort(Comparator.naturalOrder());
		}

		String keyword; // 퀴즈 제시어
		for(int i = 0; i < M; i++){
			keyword = br.readLine();
			// 1 일때 소속 그룹 출력 나머지는 그룹 맴버 출력
			if(br.readLine().equals("1")){
				System.out.println(idol.get(keyword));
			}else{
				group.get(keyword).stream().forEach(System.out::println);
			}
		}

	}

}
728x90
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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 31
글 보관함