백준 문제 풀이/백준 (JAVA)
JAVA 백준 25192 인사성 밝은 곰곰이 (심화 2)
gamja00
2024. 7. 2. 00:19
https://www.acmicpc.net/problem/25192
문제
- 첫째 줄에 채팅방의 기록 수를 나타내는 정수 N(1 <= N <= 100000) 입력.
- ENTER 표시로 새로운 사람이 채팅방에 입장.
- 새로운 사람이 입장한 이후 처음 채팅을 입력하는 사람은 곰곰티콘 인사.
- ENTER 이후 처음만 인사 2번째 부터는 평범한 채팅.
- 채팅 기록 중 곰곰티콘이 사용된 횟수 출력
초기 코드
import java.io.*;
import java.util.Objects;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int count = 0;
boolean flag=true;
int N = Integer.parseInt(br.readLine());
String[] nickname = new String[N];
for (int i = 0; i < N; i++) {
String temp = br.readLine();
if (Objects.equals("ENTER", temp)) {
nickname = new String[N];
}
else {
for (int j = 0; j < i; j++) {
if (Objects.equals(nickname[j], temp)) {
flag=false;
}
}
if(flag){
nickname[i] = temp;
count++;
}
}
}
System.out.println(count);
}
}
틀렸어요
다시 할게요
import java.io.*;
import java.util.Objects;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int count = 0, start = 0;
int N = Integer.parseInt(br.readLine());
String[] nickname = new String[N];
for (int i = 0; i < N; i++) {
boolean flag = true;
String temp = br.readLine();
if (Objects.equals("ENTER", temp)) {
nickname = new String[N];
start = 0;
} else {
for (int j = 0; j < i; j++) {
if (Objects.equals(nickname[j], temp)) {
flag = false;
break;
}
}
if (flag) {
nickname[start++] = temp;
count++;
}
}
}
System.out.println(count);
}
}
하...
또 시작이야
...아하 해시 트리... 오케이
해시 맵과 해시 셋 중에 뭘 쓸까 싶었는데 해시 맵은 키와 값 쌍으로 하는 구조였고 해시 셋은 중복된 값을 저장할 수 없는 형태이다.
당연히 중복 제거가 필요하기 때문에 해시 셋을 사용하기로 했다.
최종 코드
import java.io.*;
import java.util.HashSet;
import java.util.Objects;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int count = 0;
int N = Integer.parseInt(br.readLine());
HashSet<String> nickname = new HashSet<String>();
for (int i = 0; i < N; i++) {
String temp = br.readLine();
if (Objects.equals("ENTER", temp)) {
count += nickname.size();
nickname.clear();
} else {
nickname.add(temp);
}
}
count += nickname.size(); //마지막 더해주기
System.out.println(count);
}
}
중첩된 for 루프를 사용하던 이전 코드보다 훨씬 간결해졌고 실행 속도도 빠르다.