본문 바로가기
Computer/Algorithm_Java

[BaekJoon] 2164번 카드2 문제 풀이 (Success)

by HJ0216 2023. 9. 3.
 

2164번: 카드2

N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다. 이제 다음과 같은 동작을 카드가

www.acmicpc.net

 

Language: Java

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.Queue;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        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.add(i);
        }
 
        while (queue.size() > 1) {
            queue.remove();
            queue.add(queue.poll());
        }
 
        bw.write(queue.peek().toString());
 
        bw.flush();
        bw.close();
 
    }
 
}
 
 

🤔 해설

1. for (int i = 1; i <= N; i++) { ... }

    - 1~N까지 queue에 입력

 

2. while (queue.size() > 1) { ... }

    - 최종으로 값이 1개 남을 때까지 반복문 진행

    - queue.remove();

        - 선입선출에 의해 첫번째 입력값 제거

    - queue.add(queue.poll());

        - 선입선출에 의해 첫번째 입력값 제거 후 마지막에 입력

 

* remove(): 큐가 비어있을 때 호출 시, NoSuchElementException 발생

  poll(): 큐가 비어있을 때 호출 시, 예외를 발생시키지 않고 null 반환

 

3. bw.write(queue.peek().toString());

    - 최종으로 남은 값 출력

 

😮 이 외의 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        int N = Integer.parseInt(br.readLine());
 
        int[] iQueue = new int[N * 2];
 
        for (int i = 1; i <= N; i++) {
            iQueue[i] = i;
        }
 
        int idx_first = 1;
        int idx_last = N;
        while (N-- > 1) {
            idx_first++;
            idx_last++;
            iQueue[idx_last] = iQueue[idx_first];
            idx_first++;
        }
 
        bw.write(iQueue[idx_first] + "");
 
        bw.flush();
        bw.close();
 
    }
}
 
 

1. int[] iQueue = new int[N * 2];

    - 배열: 1부터 시작

    - 배열 삭제를 구현하지 않고, 마지막 요소의 뒤이어 추가 예정

        - 최종 1개는 출력만 하면되므로 2N-1이 될 수 있지만, 인덱스를 1부터 시작하므로 필요한 배열 공간은 2N

 

2. while (N-- > 1) { ... }

    - idx_first++, idx_last++

        - 2번째 값을 맨 마지막의 다음 칸에 입력해야하므로 1씩 증가

    - idx_first++

        - 삭제 후 맨 처음값을 맨 뒤로 옮겼으므로, 그 다음 값은 단순 삭제 대상이므로 idx_first 1 증가

 

 

 

🔗 소스 코드
GitHub

 

📚 참고 자료

 

[백준] 2164번 : 카드2 - JAVA [자바]

www.acmicpc.net/problem/2164 2164번: 카드2 N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있

st-lab.tistory.com