백준
[백준 / JAVA] 2164. 카드2
baefrica
2023. 6. 30. 01:33
반응형
https://www.acmicpc.net/problem/2164
2164번: 카드2
N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다. 이제 다음과 같은 동작을 카드가
www.acmicpc.net
💻 풀이 결과
💯 최종 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
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> queue = new LinkedList<>();
for (int i = 1; i <= N; i++) {
queue.offer(i);
}
while (true) {
// N 이 1인 경우에는 1장밖에 없기 때문에 바로 1을 출력해야한다.
// 그래서 큐의 길이 체크를 먼저 하도록 한다.
if (queue.size() == 1) {
StringBuilder sb = new StringBuilder();
sb.append(queue.poll());
System.out.println(sb);
break;
}
// 맨 위의 카드를 바닥에 버린다.
queue.poll();
// 맨 위의 카드를 제일 아래에 넣는다.
queue.offer(queue.poll());
}
}
}
💢 틀린 이유
- 다양한 시행착오가 있었고 다양한 방법으로 문제를 해결할 수 있었다.
- 테스트 케이스가 1만 있는 케이스를 생각했을 때 while 문의 코드를 실행하지 않고 바로 1을 출력해야 하는 부분을 놓쳤다. 그래서 큐의 size가 1일 때 while문을 탈출하는 조건을 while문 맨 앞에 넣었다.
- 더 좋은 방법으로는 그냥 큐의 size가 1보다 클 때만 while문에 진입하도록 조건을 걸면 될 것 같다.
- 이전의 시간 초과는 입출력 과정에서 생긴 이슈이다.
💬 풀이 과정
- 문제 그대로 큐에서의 삽입과 삭제를 순서대로 구현하면 되는 까다롭지 않은 문제였다.
- 다른 풀이 과정으로는 (2 * N) 크기의 배열을 생성하고 front와 rear의 인덱스만 조정시켜 주면서 front와 rear의 값이 같을 때까지 반복하는 방법이 있다.
다른 풀이 과정
import java.util.Scanner;
public class Main {
static int[] card;
static int front = 0;
static int rear;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
// 배열의 크기를 (2 * N) 으로 해준다
card = new int[2 * N];
for(int n = 0; n < N; n++) {
card[n] = (n + 1);
}
rear = (N - 1);
// front == rear 일 때까지 반복
while(front != rear) {
deQueue();
enQueue();
}
System.out.println(card[front]);
}
// 1. 맨 위의 카드 삭제하기
public static void deQueue() {
card[front++] = 0;
}
// 2. 맨 위의 카드를 아래로 보내기
public static void enQueue() {
card[rear+1] = card[front];
front++;
rear++;
}
}
💡 깨달은 점
1. 큐(Queue)의 메서드
- 추가
- queue.add()
- queue.offer()
- 삭제
- queue.remove() // 예외 발생
- queue.poll() // 빈 스택일 때, null 값 반환
- 조회
- queue.element() // 예외 발생
- queue.peek() // 빈 스택일 때, null 값 반환
반응형