본문 바로가기
개발 서적 리뷰/DoIt 알고리즘 코딩테스트

[큐] 백준 2164번

by 거북이의 기술블로그 2024. 11. 4.

 

문제

N장의 카드가 존재 (순서가 순차적으로 카드개수만큼 존재)
1. 1에서 N까지 번호가 존재
2. 아래 동작으로 계속 반복 후 마지막 수를 출력 
( 순서 )
    > 가장 위에 있는 카드를 바닥에 버림
    > 그다음 가장 위에있는 카드를 마지막으로 옮김
    > 이걸 반복

정수 N ( 1 <= N <= 500,000 )이 주어진다.

 

문제분석

  • 가장 위에있는 카드를 가장 마지막으로 이동 시키는 작업 ( -> Queue의 이해도 확인 )
  • 선입선출을 생각하여 문제 풀기

 

슈도코드

N개 입력 받기
for( 카드의 개수 ){
    큐에 카드 저장
}

while( 카드 1장이 남을때까지 ){
     맨위의 카드를 버림
     맨위의 카드를 가장 아래의 카드 밑으로 이동
}

마지막으로 남은 카드 출력

 

구현

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

public class App {
    public static void main(String[] args) throws Exception {
        BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
        int size = Integer.parseInt(buf.readLine());
        
        Queue<Integer> q = new LinkedList<>();

        for (int i =1; i<= size; i++){
            q.add(i);
        }

        while(q.size() > 1){
            q.poll();
            q.add(q.poll());
        }
        System.out.println(q.poll());
        
    }
}

'개발 서적 리뷰 > DoIt 알고리즘 코딩테스트' 카테고리의 다른 글

[버블정렬] 백준 2750번  (0) 2024.11.07
[우선순위 큐]백준 11286번  (0) 2024.11.06
[스택] 백준 17298  (0) 2024.10.30
[스택] 백준 1874번  (0) 2024.10.29