Study/Baekjoon

[Java] Baekjoon1592: 영식이와 친구들

devyoseph 2022. 2. 16. 10:06

영식이와 친구들

2 초 128 MB 3755 2381 2095 63.717%

문제

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

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

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

입력

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

출력

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

풀이

N명이 모여앉고 있고 한 사람이 공을 M번 받으면 종료합니다.

현재 쌓인 공의 던짐 횟수가 홀수였다면 시계방향으로 L, 아니라면 반시계로 L던집니다.

 

초기 세팅

N크기만큼 배열을 만들고 내부 값을 모두 0으로 설정합니다.

 

회전

공을 다음 L만큼 왼쪽 오른쪽 던질 때 경계값을 넘어가는 경우가 발생합니다.

일단 N크기만큼 나눠주면 N이하로 알짜 이동 경로를 구할 수 있습니다.

그런데 왼쪽으로 던지는 경우 알짜값이 음수가 나올 수 있는데 N을 더해주면 해결됩니다.

 

전체코드

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int M = sc.nextInt();
		int L = sc.nextInt();
		
		int[] arr = new int[N]; // 기본적으로 0이 채워집니다
		int cnt = 0;
		int now =  0; // now는 현재 공이 있는 위치입니다. 1번 위치(=0 인덱스)에서 공을 던집니다.
		
		while(true) {
			if(arr[now]%2==0) { // now 위치에서 현재까지 공을 받은 횟수가 짝수일 때 
				now = (now - L)%N; // 알짜 위치를 반환합니다

				if(now<0) { //0보다 작다면 N만큼 더해서 경계값으로 들어오게 합니다
					now += N;
				}

			} else { // now 위치에서 현재까지 공을 받은 횟수가 홀수일 때 
				now = (now + L)%N;
			}

			arr[now]++; //받은 개수 추가

			if(arr[now]==M) {
				break;
			}
            
			cnt++;
		}
		System.out.println(cnt);
}
}