
내가 생각했을때 문제에서 원하는부분
입력 데이터는 표준 입력을 사용한다.
입력은 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();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.