알고리즘/구현 & 그리디 & 브루트포스

[JAVA] 백준 5107번: 마니또

K.두부 2023. 7. 31. 18:00
반응형

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

 

5107번: 마니또

N명의 사람들이 있다. 이들은 각자 다른 한 명의 이름이 적힌 쪽지를 받아서, 그 사람에게 몰래 선행을 베푼다. 이때 자기 자신의 이름을 받을 수는 없으며, 선행을 받은 사람은 누가 자신을 도와

www.acmicpc.net

실버Ⅰ

 

🔶 풀이

A에서 출발해서 B, C, ··· 를 지나서 다시 A로 돌아오는 경우가 몇 개나 발생하는가.

 

1️⃣ 선행을 베푸는 사람과 선행을 받는 사람은 결코 중복되지 않는다.

2️⃣ 이름의 길이는 10글자가 넘지 않고 테스트 케이스마다 사람은 3명에서 20명이다.

 

해당 문제에서는 딱히 신경써야할 조건은 없다.

1️⃣번 조건을 봤을 때 HashMap을 사용하면 될 것 같다고 생각했다.

 

HashMap으로 마니또 목록을 입력해주고, ArrayList 배열로 참여한 사람들의 이름을 저장해줬다.

ArrayList 배열을 다 돌면서 마니또 체인을 찾아주면 된다.

 

찾는 과정에서 마니또 체인을 발견했다면 해당 마니또 목록은 제거한다.

또한, 제거를 했기 때문에 추후에 발생하는 NullPointerException을 방지하기위해 조건문으로 처리해줬다.

 

 

<최종코드>

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));
boolean flag = true;
int level = 1;
while (true) {
int N = Integer.parseInt(br.readLine());
int cnt = 0;
// 0을 입력하면 종료
if (N == 0) return;
ArrayList<String> person = new ArrayList<>(); // 참여한 사람 이름
HashMap<String, String> hm = new HashMap<>(); // 마니또 목록
for (int i=0; i<N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
String from = st.nextToken();
String to = st.nextToken();
hm.put(from, to);
person.add(from);
}
for (String from : person) {
String to = hm.get(from);
while (true) {
to = hm.get(to);
// 이미 방문했을 경우 remove 처리를 했기 때문에 값이 null
// NullPointerException 에러 방지
if (to == null) {
break;
} else if (to.equals(from)) {
hm.remove(to);
cnt++;
break;
}
}
}
System.out.println(level + " " + cnt);
level++;
}
}
}

반응형