[BAEKJOON] 백준 1592: 영식이와 친구들(C#)

2024. 5. 8. 15:20IT/BaekJoon

문제 링크

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

 

 

문제

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

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

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

 

 

입력

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

 

 

출력

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

 

 

 

통과한 답안

namespace _1592
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string[] inputs = Console.ReadLine().Split(' ');
            int N = int.Parse(inputs[0]);
            int M = int.Parse(inputs[1]);
            int L = int.Parse(inputs[2]);

            // 사람 N명, 한 사람이 M번 받으면 종료
            // 공을 받은 횟수가 홀수면 시계(+)로 L, 짝수면 반시계(-)로 L

            int[] arr = new int[N];
            int cur = 0;
            int throwCnt = 0;

            while (true)
            {
                arr[cur]++;

                if (arr[cur] == M)
                {
                    Console.WriteLine(throwCnt);
                    return;
                }

                if (arr[cur] % 2 == 1)
                {
                    cur = (cur + L) % N;
                }
                else
                {
                    cur = (cur - L + N) % N;
                }

                throwCnt++;
            }
        }
    }
}

 

이 문제에서 중요한 포인트라고 생각되는 부분은

1. 처음으로 M번 공을 잡는 순간 게임이 종료된다.

2. 원형으로 위치하고 짝수번째면 반시계 방향, 홀수번째면 시계 방향으로 공을 던지는 것.

이다.

 

M번 공을 잡는 순간 게임이 종료되는데,

처음 게임이 시작되는 순간 0번 인덱스에 있는 사람이 공을 잡고 있으므로

만약 M이 1이라면 게임은 시작하자마자 종료되므로 0을 출력해야된다.

 

또, 짝수와 홀수에 따라서 반시계, 시계를 나눈 부분은

배열 자료구조를 사용하여 처리하였는데,

짝수일 때 반시계로 처리해야되는 부분을

cur = (cur - L + N) % N;

 

위와 같이 처리할 수 있는 점이 포인트였다고 생각한다.