[백준] 수강신청(자바)

지수·2021년 8월 15일
0
post-thumbnail

알고리즘 문제 풀이를 블로그에 올리는 이유는 풀이, 코드를 기록하기 위함이니
앞으로 문제를 다 긁어오기보다 링크만 두고 풀이가 잘 보이도록 포스팅 할 예정입니다!

📄 문제

[백준] 수강신청


👩‍💻 풀이

1. 문제 이해

이 문제는 수강신청 대기 목록에서 (버튼을 두 번 이상 누른)중복값을 뒤로 밀고, 수강인원만큼 앞에서부터 순서대로 학번을 뽑아 출력하는 문제이다.

2. LinkedHashSet 활용 풀이

  • 중복값 제거에 꽂혀서 이건 set이다! 라고 생각함
  • set은 입력 순서대로 정렬이 보장되지 않음 => LinkedHashSet을 사용하면 입력 순서대로 정렬
  • 처음에 중복값이 있을 경우 뒤에 입력된 값이 무시된다고 문제를 잘못 이해하여, set에 값을 add 해주기만하고 순서대로 뽑는 코드 구현 => 당연 틀림ㅎ
  • 중복값이 입력되었을 때는 앞에 입력된 값을 없애고 뒤에 있는 값만 남겨야하기 때문에 set(remove) 추가
  • 위의 중복값 제외 처리 후, 하나씩 set에 값을 넣어줌
  • 수강인원 K만큼 iterator를 돌면서 출력
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) throws IOException {
        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());

        LinkedHashSet<String> set = new LinkedHashSet<>();
        for(int i = 0; i < L; i++) {
            String number = br.readLine();
            set.remove(number);
            set.add(number);
        }

        Iterator<String> iter = set.iterator();
        int cnt = 0;
        while(iter.hasNext() && cnt < K) {
            System.out.println(iter.next());
            cnt++;
        }
    }
}
profile
사부작 사부작

0개의 댓글