[백준, BOJ 13414] 수강신청 (java)
Problem Solving/BOJ

[백준, BOJ 13414] 수강신청 (java)

728x90

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

메모리: 72,148 KB , 시간: 712 ms

사용 알고리즘: 자료 구조, 해시를 사용한 집합과 맵, 구현

728x90

수강신청을 한 순서대로 입력을 받으며

학번을 key 값으로 같은 학번이 나온 횟수를 valueMap에 넣어준다.

 

다시 한번 수강신청을 한 순서대로 학번을 보며

map에서 학번에 해당하는 key값을 가진 value를 1씩 줄여준다.

만약 value가 이미 1이라면, 해당 학번이 마지막으로 수강신청 버튼을 누른 것이므로

답으로 출력해준다.

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

public class Main {

    public static void main(String[] args) throws Exception{

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringTokenizer st = new StringTokenizer(br.readLine());
        int K = Integer.parseInt(st.nextToken());
        int L = Integer.parseInt(st.nextToken());

        // key := 학번
        // value := key 학번이 몇 번 눌렀는지
        Map<String, Integer> map = new HashMap<>();

        // 대기열 순서
        Queue<String> q = new LinkedList<>();

        String id;
        for(int i = 0; i < L; i++) {
            id = br.readLine();
            map.put(id, map.getOrDefault(id, 0) + 1);
            q.add(id);
        }

        StringBuilder result = new StringBuilder();
        int count = 0; // 확정된 학생 수
        while(!q.isEmpty()) {
            id = q.poll();

            if(map.get(id) == 1) {
                result.append(id + "\n");
                if(++count == K) break;
            }
            else {
                map.put(id, map.get(id) - 1);
            }
        }

        System.out.print(result);
    }
}
728x90