https://www.acmicpc.net/problem/25192
문제
알고리즘 입문방 오픈 채팅방에서는 새로운 분들이 입장을 할 때마다 곰곰티콘을 사용해 인사를 한다. 이를 본 문자열 킬러 임스는 채팅방의 기록을 수집해 그 중 곰곰티콘이 사용된 횟수를 구해 보기로 했다.
ENTER는 새로운 사람이 채팅방에 입장했음을 나타낸다. 그 외는 채팅을 입력한 유저의 닉네임을 나타낸다. 닉네임은 숫자 또는 영문 대소문자로 구성되어 있다.
새로운 사람이 입장한 이후 처음 채팅을 입력하는 사람은 반드시 곰곰티콘으로 인사를 한다. 그 외의 기록은 곰곰티콘을 쓰지 않은 평범한 채팅 기록이다.
채팅 기록 중 곰곰티콘이 사용된 횟수를 구해보자!
입력
풀이과정
ENTER는 새로운 사람이 채팅방에 입장했음을 나타내며, 그 후 처음 채팅을 입력하는 사람은 반드시 곰곰티콘으로 인사를 한다고 한다. 그리고 출력은 곰곰티콘이 사용된 횟수를 출력해야한다.
생각해보자. 새로운 사람이 채팅방에 입장했다면 그 후에 채팅을 입력하는 모든 사람은 곰곰티콘으로 입력한다. 만약 'user01' 닉네임을 가진 사람이 처음 채팅을 입력하여 곰곰티콘을 출력했다면 그 후 다시 채팅을 입력할 땐 곰곰티콘을 입력하지 않는다.
하지만 고려해야할 부분은 이 후에 다시 새로운 사람이 채팅방에 입장했을 때이다. 또 다시 새로운 사람이 채팅방에 입장하면 'user01' 사람은 채팅을 입력할 때 또 다시 곰곰티콘을 출력해야한다.
이 부분을 코드로 구현해보자.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;
public class Main{
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int count = 0;
Set<String> set = null;
while( N-- > 0 ){
String nickName = br.readLine();
if( "ENTER".equals(nickName) )
set = new HashSet<>();
else if ( set.add(nickName) )
count++;
}
System.out.println(count);
}
}
O(1)만에 입력된 사람을 찾기 위해 Set을 사용하였다. 만약 입력으로 "ENTER"가 주어진다면 처음 채팅을 입력하는 모든 사람이 곰곰티콘을 출력해야하므로 Set 변수에 새로운 HashSet 인스턴스를 할당한다.
"ENTER"가 아닌 닉네임이 주어진다면 set에 입력으로 주어진 닉네임이 있는지 확인한다. set에 처음 저장하는 닉네임이면 해당 사람은 "ENTER"가 주어진 후 처음 채팅을 입력하는 것이므로 곰곰티콘을 출력한다. 따라서 count 변수에 1을 더하고 set에 이미 저장되어있는 닉네임이면 평범한 채팅을 입력한다.