백준 문제 풀이/백준 (JAVA)

JAVA 백준 25192 인사성 밝은 곰곰이 (심화 2)

gamja00 2024. 7. 2. 00:19

 


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


문제

  1. 첫째 줄에 채팅방의 기록 수를 나타내는 정수 N(1 <= N <= 100000) 입력.
  2. ENTER 표시로 새로운 사람이 채팅방에 입장.
  3. 새로운 사람이 입장한 이후 처음 채팅을 입력하는 사람은 곰곰티콘 인사.
  4. ENTER 이후 처음만 인사 2번째 부터는 평범한 채팅.
  5. 채팅 기록 중 곰곰티콘이 사용된 횟수 출력

 

초기 코드

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 루프를 사용하던 이전 코드보다 훨씬 간결해졌고 실행 속도도 빠르다.