백준 25192 인사성 밝은 곰곰이 [JAVA]

Ga0·2023년 6월 4일
0

baekjoon

목록 보기
65/123

문제 해석

  • 첫번째 줄에는 채팅방 기록 수 N을 입력받고, N개 만큼 채팅기록자의 닉네임을 입력받아 처음들어와서 곰곰이모티콘을 쓴 횟수를 출력하면 된다.
  • 단, ENTER후에 채팅기록자를 입력받는데 새로운 ENTER이 나오면 처음 ENTER에 들어온 채팅기록자일자라도 새로 들어온 사람처럼 센다.
  • 같은 ENTER안에 들어가 있는 동일 유저는 카운트 한번만 센다. (왜냐, 채팅을 친 거이기 때문에)

코드

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));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        HashSet enterMember = new HashSet(); //유저 닉네임둘 저장하는 (한 ENTER의)

        int N = Integer.parseInt(br.readLine()); //채팅방 기록 수
        int count = 0; // 곰곰 이모티콘을 사용한 횟수를 저장하는

        for(int i = 0; i < N; i++){
            String chat = br.readLine(); //입력받은 문자열

            if(chat.equals("ENTER")){ //들어옴 (기존 유저 초기화)
                count += enterMember.size(); //기존에 저장된 유저의 닉네임 중복제거한 개수를 누적 더하기

                //누적 더하기 한 후에 초기화한다. (새로 세야하기 때문)
                enterMember = new HashSet();

            }else{ //ENTER이 아닌 경우는 유저의 닉네임 저장
                enterMember.add(chat);
            }
        }

        //모두 입력 받았으면 마지막 ENTER의 곰곰임티 횟수(들어온 사람의 수)를 누적 더하기 해줘야함
        count += enterMember.size();

        bw.write(count + "\n");

        br.close();
        bw.flush();
        bw.close();
    }

}
  • 코드에 대한 설명은 주석으로 자세히 적어 두었다.

결과

  • 시간이 많이 소요된다😥

코드2

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));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        HashSet enterMember = new HashSet(); //유저 닉네임둘 저장하는 (한 ENTER의)

        int N = Integer.parseInt(br.readLine()); //채팅방 기록 수
        int count = 0; // 곰곰 이모티콘을 사용한 횟수를 저장하는

        while(N --> 0) { //N이 0이 될까지 반복 (N--; N > 0; 이 두 가지를 합쳐놓은 것)
            String str = br.readLine();

            if(str.equals("ENTER")) { //들어옴 (기존 유저 초기화)
                count += enterMember.size(); //기존에 저장된 유저의 닉네임 중복제거한 개수를 누적 더하기
                enterMember.clear(); //누적 더하기 한 후에 초기화한다. (새로 세야하기 때문)
                continue; //ENTER은 유저 닉네임에 속하지 않으므로 다음 반복문으로 넘어간다.
            }

            enterMember.add(str);
        }

        //모두 입력 받았으면 마지막 ENTER의 곰곰임티 횟수(들어온 사람의 수)를 누적 더하기 해줘야함
        count += enterMember.size();

        bw.write(count + "\n");

        br.close();
        bw.flush();
        bw.close();
    }

}
  • 아래의 형태를 계속 외면해 왔는데 생각보다 편한 것 같아서 사용해 보았다.
/* 
	[정리]
	- while문 조건의 형태중에 while(variable-- > 0)이 있는데,
	- 여기서 '-- >'은 variable--; variable > 0; 이 두 가지를 합쳐놓은 것이다.
    - 0 보다 조건 값을 뺀 값이 같거나 클 경우, 즉 -- (연산자)와 > (연산자)를 합쳐 놓은 형태
*/

while(variable-- > 0) {
	/*실행할 내용의 코드*/
}

결과2

느낀 점

  • 이 문제도 시간과 메모리가 문제인 것말고는 어려움없이 풀 수 있었다.

0개의 댓글