백준 유니대전 퀴즈쇼

KIMYEONGJUN·2025년 11월 27일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

첫 번째 줄에 채팅 개수 N과 정답자의 닉네임 S가 공백으로 구분되어 주어진다. (2 ≤ N ≤ 1,000)
두 번째 줄부터 차례로 N개의 채팅 기록이 시간순으로 주어진다.
채팅 기록은 닉네임과 채팅 내용이 공백으로 구분되어 주어진다.
각 닉네임과 채팅 내용은 길이가 1이상 10이하이며 알파벳 소문자로만 이루어져 있다.
한 사람이 두 번 이상 채팅을 친 경우는 주어지지 않으며, 정답자의 닉네임 S는 반드시 채팅 기록에 등장한다.

첫 번째 줄에 아쉬운 사람의 명수를 출력한다.

내가 이 문제를 보고 생각해본 부분

초기 설정 및 입력 읽기:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));: 빠른 입력을 위해 BufferedReader를 사용한다.
String[] firstLine = br.readLine().split(" ");: 첫 줄(N과 S)을 읽어 공백으로 분리한다.
int N = Integer.parseInt(firstLine[0]);: 채팅 개수 N을 정수로 변환하여 저장한다.
String S = firstLine[1];: 당첨자의 닉네임 S를 저장한다.
채팅 기록 저장 및 당첨자 정보 추출:
List<String[]> chats = new ArrayList<>();: 모든 채팅 기록을 [닉네임, 내용] 형태의 String 배열로 ArrayList에 저장한다. 
이 리스트는 채팅이 발생한 시간순서대로 기록된다.
String winnerChatContent = "";: 당첨자가 보낸 '정답' 채팅 내용을 저장할 변수이다.
int winnerChatIndex = -1;: chats 리스트에서 당첨자가 채팅한 순서를 나타내는 인덱스를 저장할 변수이다.
for (int i = 0; i < N; i++): N번 반복하면서 각 채팅 기록을 읽는다.
String[] chatLine = br.readLine().split(" ");: 각 줄의 채팅을 닉네임과 내용으로 분리한다.
chats.add(chatLine);: 분리된 닉네임과 내용을 chats 리스트에 추가한다.
if (chatLine[0].equals(S)): 만약 현재 읽은 채팅의 닉네임이 당첨자의 닉네임 S와 같다면, 해당 채팅이 정답을 포함하는 것으로 판단한다.
winnerChatContent = chatLine[1];: 이 채팅의 내용(두 번째 요소)을 winnerChatContent에 저장합니다. 이것이 바로 "정답"이다.
winnerChatIndex = i;: 이 채팅의 인덱스 i를 winnerChatIndex에 저장한다.
아쉬운 사람 수 계산:
int disappointedCount = 0;: "아쉬운 사람"의 수를 셀 변수를 초기화한다.
for (int i = 0; i < winnerChatIndex; i++): 당첨자의 채팅 winnerChatIndex 이전에 올라온 모든 채팅을 다시 확인한다.
if (chats.get(i)[1].equals(winnerChatContent)): 현재 확인하는 채팅의 내용(chats.get(i)[1])이 당첨자가 보낸 정답 메시지(winnerChatContent)와 동일한지 확인한다.
만약 동일하다면, 당첨자보다 먼저 같은 정답을 친 것이므로 disappointedCount를 1 증가시킨다.
결과 출력:
System.out.println(disappointedCount);: 최종적으로 계산된 disappointedCount를 출력한다.
br.close();: 사용이 끝난 BufferedReader를 닫아 자원을 해제한다.

코드로 구현

package baekjoon.baekjoon_31;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

// 백준 20362번 문제
public class Main1219 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // 첫 번째 줄에서 채팅 개수 N과 당첨자 닉네임 S를 읽습니다.
        String[] firstLine = br.readLine().split(" ");
        int N = Integer.parseInt(firstLine[0]); // 채팅 개수
        String S = firstLine[1]; // 당첨자 닉네임

        // 모든 채팅 기록을 저장할 리스트를 만듭니다. 각 채팅은 [닉네임, 내용] 형태로 저장됩니다.
        List<String[]> chats = new ArrayList<>();
        String winnerChatContent = ""; // 당첨자가 보낸 채팅 내용 (정답)
        int winnerChatIndex = -1; // 당첨자의 채팅이 기록된 순서 (인덱스)

        // N개의 채팅 기록을 시간순으로 읽고 처리합니다.
        for (int i = 0; i < N; i++) {
            String[] chatLine = br.readLine().split(" "); // "닉네임 내용"을 공백으로 분리
            chats.add(chatLine); // 채팅 기록을 리스트에 추가

            // 만약 현재 채팅의 닉네임이 당첨자 닉네임(S)과 같다면,
            // 이 채팅이 정답 메시지를 포함하고 있는 것으로 간주합니다.
            if (chatLine[0].equals(S)) {
                winnerChatContent = chatLine[1]; // 당첨자의 채팅 내용을 정답으로 설정
                winnerChatIndex = i; // 당첨자 채팅의 인덱스를 기록
            }
        }

        int disappointedCount = 0; // 아쉬운 사람의 수를 세는 변수
        // 당첨자의 채팅 기록이 나오기 전까지의 채팅들을 확인합니다.
        // i는 0부터 winnerChatIndex-1까지 반복됩니다.
        for (int i = 0; i < winnerChatIndex; i++) {
            // 현재 확인하는 채팅의 내용(chats.get(i)[1])이 당첨자의 정답 메시지(winnerChatContent)와 같다면,
            // 이 사람은 당첨자보다 먼저 정답을 외친 "아쉬운 사람"입니다.
            if (chats.get(i)[1].equals(winnerChatContent)) {
                disappointedCount++; // 아쉬운 사람 수 증가
            }
        }

        // 최종적으로 아쉬운 사람의 수를 출력합니다.
        System.out.println(disappointedCount);
        br.close(); // BufferedReader를 닫습니다.
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글