본문 바로가기
Study or Lecture/항해 99클럽 코딩테스트 스터디

항해 99클럽 코딩테스트 스터디 18일차 TIL (자바 / 비기너)

by yoondoo 2024. 11. 14.
728x90

<오늘의 학습 키워드>

- 큐

<오늘의 문제>

제목 : 백준 / 실버5 / 26042번 식당입구대기줄

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

<풀이>

정답은 더보기

더보기
package BOJ.자료구조.식당입구대기줄_26042.insub2004_2411114;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;

public class Main {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        LinkedList<Integer> students = new LinkedList<>();

        int maxSize = -1;
        int minNumber = 100001;

        for (int i = 0; i < N; i++) {
            String[] str = br.readLine().split(" ");
            if (str.length > 1) {
                students.add(Integer.parseInt(String.valueOf(str[1]))); // charAt(i)로 받으면 123을 1로만 저장...

                // 잘못 생각한 점
                // 1. 4명 대기중에 2명 빠지고 다시 6명이 줄섰으면 mas가 4 -> 6명이게 아니라 4 - 2 + 6이 되야함
                // 2. 이 계산을 2가 입력되었을 때가 아니라 1이 입력되었을 때 했어야 했다 -> 매번 사이즈를 봐야하니깐
                if (students.size() > maxSize) {
                    maxSize = students.size();
                    minNumber = students.peekLast();    // 여러번일때는 최대대기줄일 때는 마지막 학생 숫자가 작은걸로 유지

                } else if (students.size() == maxSize) {
                    if (minNumber > students.peekLast()) {
                        minNumber = students.peekLast();    // 같을 때는 최대 대기줄일 때 마지막 학생 숫자가 작은걸로 유지
                    }
                }
            } else {
                students.poll();
            }
        }

        System.out.println(maxSize + " " + minNumber);
    }
}

 

  • - "1 a"로 입력이 되었을 때는 Queue(대기줄)에다가 a를 add(a)해 준다.
    • 그와 동시에 대기줄의 길이가 max인지 -> max라면 masSize의 변수를 업데이트, 맨 뒤에 있는 학생의 번호도 minNumber에 업데이트 한다.
    • 만약에 대기줄에서 몇명이 빠지고 다시 채워졌을 때 maxSize와 동일하다면 학생수가 낮은 번호로 minNumber를 업데이트 해준다.
  • "2"가 입력되었을 때는 Queue(대기줄)에서 맨 앞에 있는 학생을 poll() 해준다.
  • "1 a" 입력 방식과 "2" 입력 방식을 나누는 기준은 readLine().split(" ") 했을 때 배열의 길이가 1이냐 아니냐로 구분했다. 

 

<결론, 주의할점>

  • 처음에 배열로 판단하지 않고 문자열의 길이가 1이 넘으면 charAt(2)이걸로 저장했었는데 치명적인 실수였다.
    • 만약 "1 532"이 입력되었을 때 charAt(2)를 저장하면 5만 저장된다.
  • 대기줄이 maxSize를 넘게 되면 무지성 맨 뒤의 학생의 번호를 넣어주면 되었다.
  • 5명이였다가 2명이 빠지고 다시 2명이 줄을 섰을 때 maxSize의 길이가 기존 max와 같아지는데 이때 원래 저장되어 있던 minNumber와 비교를 해서 현재 학생의 번호가 더 작으면 현재 학생의 번호로 업데이트 해줘야한다.
반응형

댓글