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

이 문제는 새로운 사용자가 입장(ENTER)할 때마다, 그 이후 처음 채팅하는 유저들은 모두 곰곰티콘으로 인사를 한다는 조건을 바탕으로, ENTER 이후 처음으로 채팅을 남긴 유저의 수를 세는 문제입니다. 이 문제에서 중요한 점은 각 새로운 입장(ENTER) 이후에 중복된 닉네임은 곰곰티콘으로 인사하지 않는다는 것입니다.
HashSet을 사용하여, ENTER 이후 첫 번째로 채팅을 입력한 유저를 기록합니다. 이미 기록된 유저는 두 번 인사하지 않도록 해야 합니다.HashSet을 초기화하고, 그 이후 등장하는 유저들은 다시 처음 인사할 수 있게 처리합니다.import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 채팅 기록 수
int N = Integer.parseInt(br.readLine());
// 중복된 닉네임을 처리하기 위한 집합
Set<String> userSet = new HashSet<>();
int greetingCount = 0; // 곰곰티콘 인사 횟수
// 채팅 기록 처리
for (int i = 0; i < N; i++) {
String input = br.readLine();
if (input.equals("ENTER")) {
// 새로운 입장(ENTER)이 있으면 새로운 그룹을 시작 -> Set 초기화
userSet.clear();
} else {
// 처음으로 채팅한 유저만 곰곰티콘을 사용하므로 Set에 없을 경우만 카운트
if (!userSet.contains(input)) {
greetingCount++;
userSet.add(input);
}
}
}
// 결과 출력
System.out.println(greetingCount);
}
}
N이 주어집니다.N개의 줄에 걸쳐서 ENTER 또는 유저의 닉네임이 문자열로 주어집니다.Set<String> 자료구조인 userSet을 사용하여, 중복된 유저 이름을 관리합니다. 이는 ENTER가 나올 때마다 초기화되어 새로운 유저 그룹을 시작합니다.userSet을 통해 확인하고, 해당 유저가 처음 등장할 때만 카운트를 증가시킵니다.Set을 초기화하여 새로운 유저 그룹을 관리합니다.userSet에 해당 유저가 없을 경우에만 카운트를 증가시킵니다.N번이 주어지며, 각 입력에 대해 문자열 비교를 수행합니다. 문자열 비교는 입력 문자열의 길이에 비례하는 시간이 소요됩니다.HashSet의 삽입 및 조회 연산은 평균적으로 O(1) 시간에 처리됩니다. 따라서 각 유저의 이름을 Set에 추가하거나 조회하는 작업은 O(1) 시간에 수행됩니다.N이 최대 100,000이므로 매우 효율적입니다.N개의 닉네임을 저장할 수 있으므로, 공간 복잡도는 O(N)입니다.이 코드는 주어진 문제를 O(N)의 시간 복잡도로 해결할 수 있으며, 자바의 HashSet을 이용해 중복 유저 처리와 곰곰티콘 인사를 효율적으로 관리합니다. N이 최대 100,000일 때도 제한 시간 내에 충분히 동작할 수 있습니다.