본문 바로가기

백준/JAVA

[Baekjoon/JAVA] 1592번 - 영식이와 친구들

Baekjoon Online Judge

문제로 이동

 

문제

영식이와 친구들이 원형으로 모여서 시계방향으로 1부터 N까지 적혀있는 자리에 앉는다. 영식이와 친구들은 공 던지는 게임을 하기로 했다. 게임의 규칙은 다음과 같다.

일단 1번 자리에 앉은 사람이 공을 받는다. 그리고 나서 공을 다른 사람에게 던진다. 다시 공을 받은 사람은 다시 공을 던지고, 이를 계속 반복한다. 한 사람이 공을 M번 받았으면 게임은 끝난다. (지금 받은 공도 포함하여 센다.) 공을 M번보다 적게 받은 사람이 공을 던질 때, 현재 공을 받은 횟수가 홀수번이면 자기의 현재 위치에서 시계 방향으로 L번째 있는 사람에게, 짝수번이면 자기의 현재 위치에서 반시계 방향으로 L번째 있는 사람에게 공을 던진다.

공을 총 몇 번 던지는지 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 N, M, L이 입력으로 들어온다. N은 3보다 크거나 같고, 50보다 작거나 같은 자연수이고, M은 50보다 작거나 같은 자연수이다. L은 N-1보다 작거나 같은 자연수이다.

 

출력

첫째 줄에 공을 몇 번 던지는지 횟수를 출력한다.

 


예제 입력 예제 출력
5 3 2 10
4 1 3 0
10 3 5 4
15 4 9 15

풀이

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        int N = in.nextInt(); // 사람 수
        int M = in.nextInt(); // 어느 한 사람이 받아야하는 공의 횟수
        int L = in.nextInt(); // 공의 현재 위치에서 L번째 있는 사람

        // 각각 공을 받은 횟수
        int[] people = new int[N];
        for (int i = 0; i < N; i++)
            people[i] = 0;

        int num = 0; // 현재 공을 가지고 있는 사람
        int count = 0; // 공을 던진 횟수

        while (true) {
            people[num]++;

            // 한 사람이 공을 M번 받았으면 게임은 끝
            if (people[num] >= M) break;

            // 현재 공을 받은 횟수가 홀수번 : 현재 위치에서 시계 방향으로 L번째
            // 현재 공을 받은 횟수가 짝수번 : 현재 위치에서 반시계 방향으로 L번째
            if (people[num] % 2 == 0)
                num = (num + L) % N;
            else if (people[num] % 2 == 1)
                num = (num - L + N) % N;

            count++;
        }

        System.out.println(count);
    }
}

좌우로 길게 뻗은 N칸짜리 배열을 억지로 구부려서 원을 만들었고, 현재의 위치를 idx라고 할 때 시계/반시계 방향으로 L번째 칸은 아래와 같다.

 

시계 방향으로 L번째 = (dix + L) % N

반시계 방향으로 L번째 =  (dix - L + N) % N