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

 

13414번: 수강신청

입력 데이터는 표준 입력을 사용한다. 입력은 1개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 과목의 수강 가능 인원 K(1 ≤ K ≤ 100,000)와 학생들이 버튼을 클릭한 순서를 기록한 대기목

www.acmicpc.net

코드설명

LinkedHashSet 을 활용합니다.

 

물론, ArrayList나 LinkedList를 만들어서 직접 순서를 바로바로 뒤로 바꿔주는것도 가능합니다.

하지만, 갱신하려는 학번의 위치를 매번 탐색할경우 최악의 경우 O(N^2)의 복잡도가 나옵니다.

 

그대신에 LinkedHashSet을 활용해서 조회에 걸리는 시간을 O(1)로 조회할 수 있습니다.

코드

package algorhythm;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.StringTokenizer;

public class Main {
	public static int N, T;
	public static HashSet<String> hashset = new LinkedHashSet<String>();
	public static int answer = 0;
	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());
		
		for(int i=0;i<L;i++) {
			st = new StringTokenizer(br.readLine());
			String input = st.nextToken();
			if(hashset.contains(input) == true) {
				hashset.remove(input);
			}
			hashset.add(input);
		}
		
		answer = 0; 
		for(String input : hashset) {
			if(answer < K) {
				System.out.println(input);
				answer += 1;
			}
		}
	}
}

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.StringTokenizer;

public class Main {
    private static int N, T, K, M, L;
    private static int[] arr;
    private static int answer = 0;
    private static LinkedHashSet<String> hashset = new LinkedHashSet<>();
    public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		N = Integer.parseInt(st.nextToken());
		L = Integer.parseInt(st.nextToken());
		
		for(int i=0;i<L;i++) {
			st = new StringTokenizer(br.readLine());
			String sNum = st.nextToken();
			if(hashset.contains(sNum) == true) {
				hashset.remove(sNum);
			}
			hashset.add(sNum);
		}
		
		for(String v : hashset) {
			if(++answer > N) break; 
			System.out.println(v);
		}
    }
    
    
}

+ Recent posts