백준 수강신청

KIMYEONGJUN·2026년 2월 23일
post-thumbnail

문제

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

입력 데이터는 표준 입력을 사용한다.
입력은 1개의 테스트 데이터로 구성된다.
입력의 첫 번째 줄에는 과목의 수강 가능 인원 K(1 ≤ K ≤ 100,000)와 학생들이 버튼을 클릭한 순서를 기록한 대기목록의 길이 L(1 ≤ L ≤ 500,000)이 주어진다.
두 번째 줄부터 L개의 줄에는 수강신청을 버튼을 클릭한 학생의 학번이 클릭 순서대로 주어진다.
학번은 8자리의 숫자로 이루어져 있다.

출력은 표준 출력을 사용한다.
입력받은 데이터에 대해, 수강신청 관리 시스템의 규칙을 적용한 후 수강신청에 성공한 인원의 학번을 한 줄에 1개씩 출력한다.

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

BufferedReader로 첫 줄에서 수강 가능 인원 K와 대기 목록 길이 L을 읽는다.
LinkedHashSet<String> 자료구조를 사용해 학번의 순서를 저장한다.
LinkedHashSet은 입력 순서 유지 + 중복 불허가 특징이다.
클릭한 각 학번을 읽으며:
만약 이미 대기목록에 있다면, 먼저 제거(remove)해서 기존 위치를 없애고 새로운 위치(맨 뒤)로 옮긴다(add).
없으면 그냥 추가(add).
최종적으로 대기목록에 들어간 학생들은 가장 최근 클릭 순서대로 정렬되어 있다.
앞에서부터 최대 K명 출력한다.
출력 후 BufferedReader를 닫는다.

코드로 구현

package baekjoon.baekjoon_33;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedHashSet;
import java.util.Iterator;

// 백준 13414번 문제
public class Main1308 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] firstLine = br.readLine().split(" ");
        int K = Integer.parseInt(firstLine[0]);  // 수강 가능 인원
        int L = Integer.parseInt(firstLine[1]);  // 대기 목록 길이

        LinkedHashSet<String> waitingSet = new LinkedHashSet<>();

        for (int i = 0; i < L; i++) {
            String student = br.readLine();
            // 이미 존재하면 제거 후 다시 넣어 순서를 갱신
            if (waitingSet.contains(student)) {
                waitingSet.remove(student);
            }
            waitingSet.add(student);
        }

        Iterator<String> it = waitingSet.iterator();
        int count = 0;
        while (it.hasNext() && count < K) {
            System.out.println(it.next());
            count++;
        }

        br.close();
    }
}

마무리

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

profile
Junior backend developer

0개의 댓글