Algorithm

[Algorithm/Java] 알고리즘 자바 공주 구하기 (코딩테스트, Stack, Queue, 스택, 큐, 자료구조, 큐 사용법)

권락현 2022. 4. 18. 16:39


1. 문제 설명

  • 설명
    정보 왕국의 이웃 나라 외동딸 공주가 숲속의 괴물에게 잡혀갔습니다.
    정보 왕국에는 왕자가 N명이 있는데 서로 공주를 구하러 가겠다고 합니다.
    정보왕국의 왕은 다음과 같은 방법으로 공주를 구하러 갈 왕자를 결정하기로 했습니다.
    왕은 왕자들을 나이 순으로 1번부터 N번까지 차례로 번호를 매긴다.
    그리고 1번 왕자부터 N번 왕자까지 순서대로 시계 방향으로 돌아가며 동그랗게 앉게 한다.
    그리고 1번 왕자부터 시계방향으로 돌아가며 1부터 시작하여 번호를 외치게 한다.
    한 왕자가 K(특정숫자)를 외치면 그 왕자는 공주를 구하러 가는데서 제외되고 원 밖으로 나오게 된다.
    그리고 다음 왕자부터 다시 1부터 시작하여 번호를 외친다.
    이렇게 해서 마지막까지 남은 왕자가 공주를 구하러 갈 수 있다.
    예를 들어 총 8명의 왕자가 있고, 3을 외친 왕자가 제외된다고 하자. 처음에는 3번 왕자가 3을 외쳐 제외된다.
    이어 6, 1, 5, 2, 8, 4번 왕자가 차례대로 제외되고 마지막까지 남게 된 7번 왕자에게 공주를 구하러갑니다.
    N과 K가 주어질 때 공주를 구하러 갈 왕자의 번호를 출력하는 프로그램을 작성하시오.
  • 입력
    첫 줄에 자연수 N(5<=N<=1,000)과 K(2<=K<=9)가 주어진다.
  • 출력
    첫 줄에 마지막 남은 왕자의 번호를 출력합니다.
 

 

2. 문제 코드 및 풀이 설명

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

public class RescuePrincess {
  public static void main(String[] args) {
    RescuePrincess T = new RescuePrincess();
    Scanner kb = new Scanner(System.in);
    int n = kb.nextInt();
    int k = kb.nextInt();
    System.out.println(T.solution(n, k));
  }

  // 해결방법
  // 큐를 이용하여 세어주자
  // 입력된 큐에서 숫자를 세어줄때 k번째 사람이 아니면 poll을 해서 다시 큐에 입력시킨다
  // k번째 사람이면 poll만 해주고 다시 넣지 않는다
  // 큐에 하나가 남았을때 리턴
  public int solution(int n, int k) {
    int answer = 0;
    Queue<Integer> Q = new LinkedList<>();

    // 큐에 1~n까지 입력
    for (int i = 1; i <= n; i++) Q.offer(i);
    // 큐에 하나 남을때까지 반복
    while (Q.size() != 1) {
      // k번째 수가 아니면 다시 큐에 입력
      for (int i = 1; i < k; i++) Q.offer(Q.poll());
      // k번째 수라면 제거
      Q.poll();
    }
    answer = Q.poll(); // 하나 남은 수 출력
    return answer;
  }
}

 

3. 출력 예시

입력
10 3

출력
4

 

 


위의 내용은 인프런에서 수강할 수 있는 김태원님의 자바 알고리즘 문제풀이 강의를 바탕으로 공부한 내용을 정리한 내용입니다!

https://inf.run/iAi6

 

자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비 - 인프런 | 강의

자바(Java)로 코딩테스트를 준비하시는 분을 위한 강좌입니다. 코딩테스트에서 가장 많이 출제되는 Top 10 Topic을 다루고 있습니다. 주제와 연동하여 기초문제부터 중급문제까지 단계적으로 구성

www.inflearn.com