이번에 풀어본 문제는
백준 13414번 수강신청 입니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static int K, L;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
K = Integer.parseInt(st.nextToken());
L = Integer.parseInt(st.nextToken());
Queue<String> q = new LinkedList<>();
Map<String, Integer> map = new HashMap<>();
for (int i = 0; i < L; i++) {
String studentNumber = br.readLine();
map.put(studentNumber, map.getOrDefault(studentNumber, 0) + 1);
q.add(studentNumber);
}
StringBuilder sb = new StringBuilder();
while (!q.isEmpty()) {
String cur = q.poll();
int requestCount = map.get(cur);
if (requestCount > 1) {
map.put(cur, requestCount - 1);
} else {
sb.append(cur).append("\n");
K--;
// K만큼 뽑았으면 그만
if (K == 0) break;
}
}
sb.deleteCharAt(sb.length() - 1);
System.out.print(sb);
}
}
큐와 맵을 활용해서 풀어보았습니다.
중복으로 신청하지 않은 학생들에 대해 순서를 보장하기 위해 입력된 순서대로 큐에 담아주고, 담는 반복과 동시에 신청 횟수에 대한 카운트를 맵에 담아줍니다.
그러면 순서가 담긴 큐를 탐색하는 과정에서 이 학생이 몇 회 버튼을 클릭한지 여부를 맵을 통해 때마다 확인할 수 있고, 꺼냈을 때 잔여 버튼 클릭 횟수가 1을 넘지 않는다면 해당 학생을 수용하도록 했습니다.