코딩테스트/Java

[JAVA] 백준 수강신청

SK_MOUSE 2022. 2. 9. 14:50
반응형

주의할점

1. 학번은 Integer형이 아닌 String으로 받아야한다. (예를들어 012345678이라는 학번은 Integer형으로 받을시 1234578로 데이터의 변형이 발생한다.)

2. (수강가능인원) > (대기목록의길이) 인 경우를 생각해아한다. ((IndexOutOfBounds) 발생 가능성)

 

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

처음 작성한 코드.

  1. HashMap을 통해서 중복제거와 동시에 우선순위를 뜻하는 key를 넣어준다.(순서 역할)
  2. ArrayList에 위 key를 이용한 Student 객체를 넣어주고 정렬한다.
  3. ArrayList에서 필요한 객체를 순서대로 반환한다.
import java.io.*;
import java.util.*;

public class Main {
    static int k, l;
    static HashMap<String, Integer> hm;

    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());
        hm = new HashMap<>();

        for (int i = 0; i < l; i++) {
            String id = br.readLine();
            hm.put(id, i);
        }
        ArrayList<Student> list = new ArrayList<>();
        for (String ids : hm.keySet()) {
            list.add(new Student(ids, hm.get(ids)));
        }

        list.sort(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return o1.num - o2.num;
            }
        });
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < k; i++) {
            if (list.size() == i) break;
            sb.append(list.get(i).id).append('\n');
        }
        System.out.print(sb.toString());
    }

    static class Student {
        String id;
        int num;

        public Student(String id, int num) {
            this.id = id;
            this.num = num;
        }
    }
}

 

LinkedHashSet을 이용한 코드.

: Linked HashSet을 사용할 때 이미 학번이 있으면 지워버리는 작업을 통해 중복제거 및 순위 미루기를 할 수 있다.

LinkedHashSet은 순서가 있으므로 출력할때 iterator를 사용하여 출력가능.

import java.io.*;
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());
        LinkedHashSet<String> set = new LinkedHashSet<>();

        for (int i = 0; i < l; i++) {
            String id = br.readLine();
            set.remove(id);
            set.add(id);
        }
        StringBuilder sb =new StringBuilder();
        int count=0;
        Iterator<String> iter= set.iterator();
        while(iter.hasNext() && count<k){
            sb.append(iter.next()).append('\n');
            count++;
        }
        System.out.print(sb.toString());
    }
}
반응형