Baekjoon 문제 풀기 (2164번 : 카드2) Java

2164번 : 카드2

1. 문제읽기


이해하는데 어렵지 않은 문제

처음에 스택과 큐를 헷갈려서 스택으로 구현하다가 나도모르게 그만 백준 알고리즘 분류 부분을 보고 큐라는 것을 스포당해버렸다.
그래서 큐로 구현했다.
메소드들은 아직 익숙하지 않아 참조하면서 풀었다.
문제 자체는 아주 기초적인 문제이다.

2. 제출 코드


왠만하면 입출력은 BufferedReader를 쓰려고 한다.
이번 문제에서는 입력 값이 작기 때문에 굳이 쓸 필요는 없었지만 익숙해지기 위해 썼다.
포폴 정리가 끝난다면 자료구조도 직접 구현하면서 공부를 한번 더 해야겠다.

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

public class BOJ2164 {
    public static void main(String[] args) throws IOException {
        // 1부터 n까지 번호
        // 맨 위 카드 없애기 그 다음 카드 제일 밑으로 보내기 반복
        // 1장이 남을 때 까지
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(bf.readLine());
        // 1부터 n까지 큐에 넣기
        Queue<Integer> queue = new LinkedList<>();
        for(int i = 1; i <= n; i++) {
            queue.add(i);
        }
        while(true) {
            if(queue.size() == 1) {  // 1개만 남았다면 출력
                System.out.println(queue.poll());
                break;
            }
            // 맨 왼쪽 버리기
            queue.remove();
            if(queue.size() == 1) {  // 1개만 남았다면 출력
                System.out.println(queue.poll());
                break;
            }
            // 맨 왼쪽 꺼를 오른쪽으로 옮기기
            queue.offer(queue.poll());
            if(queue.size() == 1) {  // 1개만 남았다면 출력
                System.out.println(queue.poll());
                break;
            }
        }
    }
}

3. 공부할 것


내 정답코드는 while문이 하드코딩이다..
처음에는 while문에 size != 0 조건을 걸려고 했는데, 1) 삭제 2) 앞의 원소를 맨 뒤로 옮기기 이 두개를 같이하면 size가 1이 안나올 것 같아서 각각 코드 뒤에 if문을 붙여서 출력했는데, n = 1일때를 고려하지 않아 틀렸다.
그리고 while문 맨 위에 if문을 하나 더 넣어줬더니 성공했다.
그러나 생각해보니 2) 앞의 원소를 맨 뒤로 옮기기는 size에 영향을 미치지 않으므로 while문에 조건을 걸어도 아무 문제가 없었다..
다듬은 코드는 아래와 같다.

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

public class BOJ2164 {
    public static void main(String[] args) throws IOException {
        // 1부터 n까지 번호
        // 맨 위 카드 없애기 그 다음 카드 제일 밑으로 보내기 반복
        // 1장이 남을 때 까지
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(bf.readLine());
        // 1부터 n까지 큐에 넣기
        Queue<Integer> queue = new LinkedList<>();
        for(int i = 1; i <= n; i++) {
            queue.add(i);
        }
        while(queue.size() != 1) {
            // 맨 왼쪽 버리기
            queue.remove();
            // 맨 왼쪽 꺼를 오른쪽으로 옮기기
            queue.offer(queue.poll());
        }
        System.out.println(queue.poll());
    }
}

댓글남기기