[백준/Java] #2164 카드2

2023. 5. 10. 16:10·알고리즘

[백준 - #2164] 카드2

https://www.acmicpc.net/problem/2164

 

2164번: 카드2

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

www.acmicpc.net

 

✔️ 문제 설명

N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다.
이제 다음과 같은 동작을 카드가 한 장 남을 때까지 반복하게 된다. 우선, 제일 위에 있는 카드를 바닥에 버린다. 그 다음, 제일 위에 있는 카드를 제일 아래에 있는 카드 밑으로 옮긴다.
예를 들어 N=4인 경우를 생각해 보자. 카드는 제일 위에서부터 1234 의 순서로 놓여있다. 1을 버리면 234가 남는다. 여기서 2를 제일 아래로 옮기면 342가 된다. 3을 버리면 42가 되고, 4를 밑으로 옮기면 24가 된다. 마지막으로 2를 버리고 나면, 남는 카드는 4가 된다.
N이 주어졌을 때, 제일 마지막에 남게 되는 카드를 구하는 프로그램을 작성하시오.

입력
첫째 줄에 정수 N(1 ≤ N ≤ 500,000)이 주어진다.

출력
첫째 줄에 남게 되는 카드의 번호를 출력한다.

 

💡 풀이

큐를 사용하는 문제로 1부터 N까지 큐에 순서대로 넣고 버릴 때는 queue의 pop 기능을, 위에 있는 카드를 버리고 다시 아래로 놓을때는 push와 pop 기능을 이용하여 풀면 되는 간단한 문제이다.

다만 자바에서 Queue는 인터페이스라서 메소드를 오버라이딩 해야되므로 바로 만들 수 없다. 연결리스트에 큐의 연산이 모두 구현되어 있어서 연결리스트를 이용하여 구현할 수 있다.

 

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main {
    public int solution(int input) {
        Queue<Integer> queue = new LinkedList();
        for (int i = 1; i <= input; i++) {
            queue.add(i);
        }
        while (queue.size() != 1) {
            queue.poll();
            queue.add(queue.poll());
        }

        return queue.poll();
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int input = sc.nextInt();
        Main result = new Main();
        System.out.println(result.solution(input));
    }
}

1부터 N까지 반복문을 이용하여 하나씩 큐에 넣고, while문을 이용해서 queue의 사이즈가 1이 될 때까지 처음 들어온 숫자를 빼고, 그 다음 숫자를 빼고 나서 다시 넣어주는 동작을 반복했다. 이 후 queue의 마지막 남은 요소를 빼면서 반환하여 출력하도록 하여 풀었다.

 

 

 

'알고리즘' 카테고리의 다른 글

[백준/Java] #18808 스티커 붙이기  (4) 2023.06.02
[백준/Java] #4179 불! (⚠️시행착오 엄청 많음 주의⚠️)  (3) 2023.05.18
[알고리즘] 바킹독 실전 알고리즘 0x04 연결리스트 연습문제  (0) 2023.05.08
[알고리즘] 바킹독 실전 알고리즘 0x03 배열 연습문제  (2) 2023.05.04
[Java] 프로그래머스 코딩테스트 입문 Day 10  (0) 2023.01.17
'알고리즘' 카테고리의 다른 글
  • [백준/Java] #18808 스티커 붙이기
  • [백준/Java] #4179 불! (⚠️시행착오 엄청 많음 주의⚠️)
  • [알고리즘] 바킹독 실전 알고리즘 0x04 연결리스트 연습문제
  • [알고리즘] 바킹독 실전 알고리즘 0x03 배열 연습문제
하늘☁️
하늘☁️
개발일지, 학습, 스터디 기록 남기는 블로그 ☁️
  • 하늘☁️
    구름일지
    하늘☁️
  • 전체
    오늘
    어제
    • 분류 전체보기 (51)
      • Python (0)
      • Java (3)
      • SQL (5)
      • 알고리즘 (31)
      • TIL (4)
      • CS (6)
      • 일상 (2)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    pccp 기출문제 3번
    명령어파이프라인
    회고
    java
    db
    TIL
    제로베이스백엔드스쿨
    boj1377
    boj12891
    프로그래머스
    mysql
    CS
    정적블록
    제로베이스부트캠프
    dna 비밀번호
    boj5427
    백준
    상속
    boj10986
    코딩테스트
    컴퓨터구조
    충돌위험 찾기
    알고리즘
    cpu의작동원리
    비순차적명령어처리기법
    코딩테스트연습
    코딩테스트입문
    학습일지
    제로베이스백엔드스쿨초단기취업반
    스터디기록
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
하늘☁️
[백준/Java] #2164 카드2
상단으로

티스토리툴바