JAVA/백준

백준 2164번: 카드2

부리와 깃털 2024. 4. 7. 22:33
728x90
반응형

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

1부터 N까지의 카드가 순서대로 있다고 하자.

이제 맨 위의 카드를 버리고, 그 다음 카드를 맨 아래로 옮겨준다.

이것을 마지막 1장 남을 때까지 반복하면 된다.

 

우선, 코드가 시키는 대로 코드를 짜봤다.

ArrayList에 수를 저장했고, while로 ArrayList의 크기가 1이 될 때까지 반복해주었다.

더보기
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		ArrayList<Integer> aList = new ArrayList<>();
		for (int i = 0; i < N; i++) aList.add(i + 1);

		while (aList.size() > 1) {
			aList.remove(0);
			aList.add(aList.remove(0));
		}
		
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		bw.write(aList.get(0) + "\n");
		bw.flush();
		bw.close();
	}
}

하지만 이 코드를 제출했을 때 시간 초과가 났다.

한 번은 코드가 더 빨리 실행되도록 코드를 봐꿔봤다.

예를 들어 1~6이 있다고 할 때 홀수번째는 사라지고 짝수번째는 순서대로 뒤에 다시 붙으므로

이걸 이용해서 코드를 만들려고 했으나 이것도 역시 실패했다.

그 다음에 큐(Queue)를 알게 됬다.

큐는 선입선출 방식을 따르는 자료구조로 해당 문제에 찰떡인 자료구조라고 생각했고,

시험삼아  기존 코드에 ArrayList를 Queue로 바꿔서 코드를 만들었는데 그걸로 문제를 풀 수 있었다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Queue;
import java.util.LinkedList;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		Queue<Integer> q = new LinkedList<>();
		for (int i = 0; i < N; i++) q.offer(i + 1);

		while (q.size() > 1) {
			q.remove();
			q.offer(q.remove());
		}

		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		bw.write(q.peek() + "\n");
		bw.flush();
		bw.close();
	}	
}

고작 자료구조를 바꿔준다고 이런 극적인 변화가 나타날 줄은 몰랐는데,

이제 알게 됬으니까 앞으로는 사용하는 자료구조에 대해 좀 신경써야겠다.

반응형