본문 바로가기
Problem Solving/Baekjoon

[백준] 12873 기념품 - Data Structure / Java

by graycode 2023. 4. 27.

 문제 링크

 

12873번: 기념품

백준이는 BOJ 알고리즘 캠프 참가자 중 한 명에게 기념품을 주려고 한다. 하지만, 많은 참가자 중에서 어떤 사람을 뽑아서 기념품을 줘야하는지 고민이 되기 시작했다. 따라서, 백준이는 게임을

www.acmicpc.net

 

 풀이 과정

각 단계 i의 세제곱 횟수만큼 Queue 에서 값을 순회시킨다면 시간 초과된다.

따라서 각 단계 i^3 - 1 에 현재 Queue 의 크기의 나머지를 구하면 해당 횟수에 기념품을 받는 사람은 동일하다.

 

이때 i^3 은 int 범위를 초과할 수 있으므로 long 으로 형변환해 순회 횟수를 구한다.

 

 풀이 코드

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

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int n = Integer.parseInt(br.readLine());

        Queue<Integer> q = new LinkedList<>();
        for (int i = 1; i <= n; i++)
            q.offer(i);

        for (int i = 1; i < n; i++, q.poll()) {
            long num = ((long) i * i * i - 1) % q.size();
            while (num-- > 0)
                q.offer(q.poll());
        }

        bw.write(String.valueOf(q.poll()));
        bw.flush();
    }

}

댓글