본문 바로가기
Java

[백준] 식당 입구 대기 줄 성공

by 간장공장공차장 2024. 11. 14.
반응형

틀린 코드 리뷰

import java.util.*;
import java.io.*;

public class Main {

    public static int[] waitingLine() throws IOException {

        int[] answer = new int[2];
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int lines = Integer.parseInt(br.readLine());

        Queue<String> waiting = new LinkedList<String>();
        int maxWaiting = 0;
        int studentNum = 0;
        int minStudentNum = 0;

        for (int i = 0; i < lines ; i++){

            String line = br.readLine();
            String[] array_line = line.split(" ");

            if(array_line.length > 1){
                waiting.offer(array_line[1]);
            }

            if(array_line.length == 1){
                waiting.poll();
            }

            if (maxWaiting < waiting.size()){
                maxWaiting = waiting.size();
                minStudentNum = Integer.parseInt(array_line[1]);
            }
            if (maxWaiting == waiting.size() && studentNum != 0){
                studentNum = Integer.parseInt(array_line[1]);
                if(minStudentNum > studentNum){
                    minStudentNum = studentNum;
                }
            }

        }

        answer[0] = maxWaiting;
        answer[1] = minStudentNum;
        return answer;

    }

    public static void main(String[] args) throws IOException {
        int[] answer = new int[2];
        answer = waitingLine();

        System.out.println(answer[0] + " " + answer[1]);

    }
}

문제점

  1. studentNum 초기화 문제:

studentNum의 초기값이 0으로 설정되어 있어, if (maxWaiting == waiting.size() && studentNum != 0) 조건이 항상 false로 처리될 수 있음.
처음 최대값이 한개일 때를 대비해 처음 초기화가 studentNum이 아닌, minStudentNum으로 해서 더 문제

  1. 학생 번호 업데이트 조건 문제:

if (maxWaiting == waiting.size() && studentNum != 0) 구문은 최대 대기열 크기가 동일할 때 studentNum를 최소 학생 번호로 업데이트하려는 의도였지만, 불필요한 로직임.
최대값일 때 가장 작은 값을 minStudentNum으로 넣어서 리턴하면 되는거지, N번째 최대값일 때, 최대값이 갱신될때를 구분해서 업데이트 할 필요는 없다

  1. 명령 처리 순서 및 로직 개선:

최대값이나, 학생 Num이 바뀌는 순간 : poll 될 때가 아닌, offer()될 때이다. 구문을 나누어 보다 명확하게 작성하였다.

import java.util.*;
import java.io.*;

public class Main {

    public static int[] waitingLine() throws IOException {
        int[] answer = new int[2];
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int lines = Integer.parseInt(br.readLine());

        Queue<Integer> waiting = new LinkedList<>();
        int maxWaiting = 0;
        int minLastStudentNum = Integer.MAX_VALUE; // 맨 뒤 학생 번호의 최소값 초기화

        for (int i = 0; i < lines; i++) {
            String line = br.readLine();
            String[] array_line = line.split(" ");
            int type = Integer.parseInt(array_line[0]);

            if (type == 1) { // 학생이 줄을 서는 경우
                int studentNum = Integer.parseInt(array_line[1]);
                waiting.offer(studentNum);

                if (waiting.size() > maxWaiting) {
                    maxWaiting = waiting.size();
                    minLastStudentNum = studentNum;
                } else if (waiting.size() == maxWaiting) {
                    minLastStudentNum = Math.min(minLastStudentNum, studentNum);
                }
            } else if (type == 2) { // 학생이 식사를 시작하는 경우
                waiting.poll();
            }
        }

        answer[0] = maxWaiting;
        answer[1] = minLastStudentNum;
        return answer;
    }

    public static void main(String[] args) throws IOException {
        int[] answer = waitingLine();
        System.out.println(answer[0] + " " + answer[1]);
    }
}
반응형

'Java' 카테고리의 다른 글

[java] 최대힙, 최소힙  (0) 2024.11.15
[java] type 변경 함수 정리  (1) 2024.11.15
[백준] 기술 연계마스터 임스  (1) 2024.11.13
[java] 문자열 나누기  (1) 2024.10.30
[java] 크기가 작은 부분 문자열  (0) 2024.10.29