티스토리 뷰
문제 요약
- 알고리즘 분류: 해시
- 난이도: Silver3
- 문제내용:
- N개의 걸그룹 수와 M개의 문제 수가 주어 진다.
- 걸그룹은 팀 이름, 인원수 맴버 이름을 차례대로 입력한다.
- M개의 문제가 주어 지는데 팀 이름이나 맴버 이름을 주어 지고 팀 이름이면 맴버 전체 이름을 출력하고 맴버 이름이 주어지면 팀 이름을 출력한다.
- 사이트: https://www.acmicpc.net/problem/16165
문제풀이
해시 자료 구조를 활용한 팀 및 멤버 관리 프로그램 구현
해시(key-value)를 활용하여 팀과 멤버를 효과적으로 관리하는 문제에 대한 해결 방법을 살펴보겠습니다. 이 문제는 Python에서는 dictionary, Java에서는 Map과 같은 자료 구조를 활용하여 해결할 수 있습니다.
구현 단계:
- 팀과 멤버를 저장하는 해시 자료 구조, 그리고 멤버와 팀을 연결하는 해시 자료 구조 2개를 선언합니다.
- 팀명을 입력받을 때, 팀과 멤버 해시 자료 구조를 리스트로 초기화합니다.
- 멤버 이름을 입력받을 때, 팀과 멤버 해시 자료 구조에 추가하고, 멤버와 팀 해시 자료 구조에는 상호 연결하여 저장합니다.
- 모든 맴버 이름이 저장된 후에는 팀-멤버 해시 자료 구조를 리스트 오름차순으로 정렬합니다.
- 문제 해결 단계에서 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);
}
}
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[BAEKJOON]9037 The candy war (1) | 2024.01.09 |
---|---|
[BAEKJOON]17224 APC는 왜 서브태스크 대회가 되었을까? (1) | 2024.01.07 |
[BAEKJOON]1920 수 찾기 (3) | 2024.01.04 |
[BAEKJOON]17389 보너스 점수 (2) | 2023.12.26 |
[BAEKJOON]17269 이름궁합 테스트 (0) | 2023.12.23 |
- Total
- Today
- Yesterday
- 넓이 우선 탐색
- BaekJoon
- Python
- 백준
- DP
- java
- JSCODE
- LeetCode
- Greedy
- 문자열
- 수학
- DFS
- 재귀호출
- 동적계획법
- 누적합
- 백트레킹
- 그리디
- 배열
- 그래프
- 동적 계획법
- 알고리즘
- BFS
- 구현
- level2
- 파이썬
- 자바
- 조합
- spring-boot
- 이론
- Programmerse
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |