https://www.acmicpc.net/problem/26069
문제
입력
풀이과정
사람들은 두 명씩 만나므로 세 경우 중 한 가지이다.
첫 번째는 둘 다 무지개 댄스를 추고 있는 경우.
두 번째는 둘 중에 한 명만 무지개 댄스를 추고 있는 경우.
세 번째는 둘 다 무지개 댄스를 추고 있지 않은 경우.
문제에서 요구하는 정답은 마지막에 무지개 댄스를 추고있는 사람이 총 몇 명인지이다.
간단한 방법으로 바로 정답을 도출할 수 있다. 위 경우의 수를 따르면 첫 번째 경우에는 모두 무지개 댄스를 추고 있으므로 댄스를 추고 있는 사람 수를 바꿀 필요가 없다.
세 번째 경우에는 둘 다 무지개 댄스를 추고 있지 않으므로 마찬가지로 댄스를 추고 있는 사람 수를 바꿀 필요가 없다.
마지막 두 번째 경우다. 두 번째 경우에선 둘 중 한 명만 무지개 댄스를 추고 있는 경우에는 다른 한 명 또한 무지개 댄스를 추게 되므로 댄스를 추고 있는 사람 수가 한 명 늘어나게 된다.
이를 토대로 코드를 작성했다.
public class Main{
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] names;
Set<String> nameSet = new HashSet<>();
// ChongChong은 한 번이상 기록되며, 무지개 댄스를 추고있는 상태이다.
nameSet.add("ChongChong");
int N = Integer.parseInt(br.readLine());
int count = 1;
while( N-- > 0 ){
names = br.readLine().split(" ");
// 둘 중 한명이 nameSet에 포함되어있다면 나머지 한명 또한 nameSet에 저장한다.
if( nameSet.contains(names[0]) && !nameSet.contains(names[1]) ) {
nameSet.add(names[1]);
count++;
}
else if( !nameSet.contains(names[0]) && nameSet.contains(names[1]) ) {
nameSet.add(names[0]);
count++;
}
}
System.out.println(count);
}
}
이름을 토대로 O(1)만에 찾기 위해 HashSet을 사용하였다. nameSet에 포함되어 있다면 댄스를 추고 있는 상태라는 의미이다.