Post

Baekjoon 2164 카드2

문제 이해

주어진 숫자 만큼의 카드를 가지고 한 장은 바닥에 버리고 한 장은 다시 뒤로 넣어서 마지막에 남는 카드를 구하는 문제이다.

입출력 조건 확인

주어진 숫자 만큼의 카드를 큐에 넣는 반복문 하나, 큐에 있는 카드를 한 장 버리고 한 장 뒤로 넣는 반복문 하나로 크게 문제가 없어 보인다.

문제 풀이 내용 정리

cardQ라는 큐를 하나 만들어서 주어진 숫자 만큼의 정수를 큐에 넣었다.

이후에 cartQ의 크기가 1이 될 때 까지 while문을 돌려서 문제에서 요구하는 작업을 반복했다.

while문을 빠져나오면 큐에 하나의 정수만이 남은 상태이므로 해당 정수를 print하였다.

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
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Queue<Integer> cardQ = new LinkedList<>();
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        boolean drop = true;

        for (int i = 1; i <= num; i++) {
            cardQ.offer(i);
        }

        while (cardQ.size() > 1) {
            int tmp = 0;
            if (drop) {
                cardQ.poll();
                drop = false;
            } else {
                tmp = cardQ.poll();
                cardQ.offer(tmp);
                drop = true;
            }
        }

        System.out.println(cardQ.poll());
    }
}

코드 문제점 및 해결 방법

문제를 풀고 다른 답을 봤더니 카드를 버리고 뒤에 넣고 하는 과정을 굳이 조건문으로 달지 않고 while문 한 번에 같이 돌려버리는 코드가 대부분이었다.

나도 첫 생각은 이거였는데 왠지 그러다가 마지막 남은 카드까지 버리면 어쩌지? 하는 생각 때문에 안전하게 가자는 생각에 조건문으로 하나씩 했는데 딱히 상관이 없었다. 어차피 카드는 하나씩 버려지니깐…

This post is licensed under CC BY 4.0 by the author.