https://www.acmicpc.net/problem/25192
알고리즘 입문방 오픈 채팅방에서는 새로운 분들이 입장을 할 때마다 곰곰티콘을 사용해 인사를 한다. 이를 본 문자열 킬러 임스는 채팅방의 기록을 수집해 그 중 곰곰티콘이 사용된 횟수를 구해 보기로 했다.
ENTER는 새로운 사람이 채팅방에 입장했음을 나타낸다. 그 외는 채팅을 입력한 유저의 닉네임을 나타낸다. 닉네임은 숫자 또는 영문 대소문자로 구성되어 있다.
새로운 사람이 입장한 이후 처음 채팅을 입력하는 사람은 반드시 곰곰티콘으로 인사를 한다. 그 외의 기록은 곰곰티콘을 쓰지 않은 평범한 채팅 기록이다.
채팅 기록 중 곰곰티콘이 사용된 횟수를 구해보자!
첫 번째 줄에는 채팅방의 기록 수를 나타내는 정수 이 주어진다. ()
두 번째 줄부터 개의 줄에 걸쳐 새로운 사람의 입장을 나타내는 ENTER, 혹은 채팅을 입력한 유저의 닉네임이 문자열로 주어진다. ()
첫 번째 주어지는 문자열은 무조건 ENTER이다.
채팅 기록 중 곰곰티콘이 사용된 횟수를 출력하시오.
문제를 이해하는 데 시간이 꽤 걸렸다.
그냥 단순히 ENTER가 주어진 이후로 들어오는, 처음 나오는 닉네임의 개수를 세면 된다고 생각했다.
따라서 SET
을 선언하고 ENTER를 제외한 나머지 닉네임들을 삽입하면 중복이 제거된 개수를 셀 수 있겠다는 생각으로 코드를 작성했다.
난이도가 실버4에 정답률이 50퍼센트가 되지 않는 문제가 이 정도로 간단하다니 뭔가 이상하다.
뭔가 놓치고 있는 게 분명하다.
문제를 다시 천천히 읽어보니 새로운 사람이 입장한 이후 '처음 채팅을 입력하는 사람'이 인사를 한다고 되어있다.
즉 ENTER가 주어지면 그 전에 이미 나온 적이 있는 닉네임이 또 나와도 다시 개수를 세어주어야 한다는 것이다.
그렇다면 ENTER가 나올 때마다 SET
을 초기화 해주어야 한다는 뜻이다.
이대로 코드를 작성해보면,
int sum = 0;
Set<String> set = new HashSet<>();
for (int i = 0; i < n; i++) {
String s = br.readLine();
if (s.equals("ENTER")) {
// ENTER가 나오면 sum변수에 지금까지 누적된 SET의 크기를 더해준다.
sum += set.size();
// SET을 초기화해준다.
set = new HashSet<>();
continue;
}
set.add(s);
}
// ENTER가 나올때만 SET의 크기를 더해주기 때문에 마지막 ENTER 이후에 쌓인 SET의 크기를 최종적으로 더해주고 출력해준다.
System.out.println(sum + set.size());
문제를 풀다 보면 이렇게 문제를 제대로 읽지 않아 잘못된 풀이를 생각하는 경우가 많다. 빠르게 풀려고 하다 보니 코드를 작성하는 데 급급해 대충 읽고 키보드부터 두드리는 것이 습관이 되었다. 열심히 작성했는데 문제 이해를 잘못해서 다시 작성해야할 때만큼 낭패인 경우가 없다. 마음을 차분히 먹고 문제 이해하는데 더 시간을 들이는 것을 연습해야겠다.