코딩테스트/Java

[JAVA] 백준 수강신청

SK_MOUSE 2022. 2. 9. 14:50
주의할점
학번은 Integer형이 아닌 String으로 받아야한다.
(수강가능인원) > (대기목록의길이) 인 경우를 생각해아한다.
처음 작성한 코드.
LinkedHashSet을 이용한 코드.

주의할점

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()); ​​​​} }
반응형