백준 13414 수강신청 (Java, 자바)

jonghyukLee·2023년 9월 14일
0

이번에 풀어본 문제는
백준 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을 넘지 않는다면 해당 학생을 수용하도록 했습니다.

profile
머무르지 않기!

0개의 댓글