영식이와 친구들

문제

언어

  • JavaScript

순서도

  1. 각 사람마다 공을 몇 번 던졌는지 세는 변수 배열 생성
  2. 사람들 중에서 공을 M 번 받은 사람이 생길 때까지
    1. 현재 공을 받은 횟수가 홀수 번이면 현재 위치에서 시계 방향으로 L 번째 있는 사람에게 공 던지기
    2. 핸재 공을 받은 횟수가 짝수 번이면 현재 위치에서 반시계 방향으로 L 번째 있는 사람에게 공 던지기
  3. 최종적으로 공을 총 몇 번 던지는지 출력

문제 풀이 step 1

  • 시물레이션 형식의 문제로 순서도에 작성한 대로 로직을 작성하면 됩니다.
  • 추가 설명은 주석으로 작성하겠습니다.

소스 코드

const input = require("fs")
	.readFileSync("/dev/stdin")
	.toString()
	.trim()
	.split("\n");

const solution = (input) => {
	const [n, m, l] = input[0].split(" ").map(Number);

	// 1 ~ N 까지 사람들 공 던진 횟수를 기록할 배열 생성
	const arr = Array(n + 1).fill(0);
	// 1 번 사람이 맨 처음에 공을 받고 던짐
	arr[1] = 1;

	let ans = 0;
	let index = 1;
	while (true) {
		// 사람들 중에서 공을 m 번 던진 사람이 있다면 종료
		if (arr[index] === m) break;

		// 짝수번 던졌으면 반시계 방향으로 L 번째 있는 사람에게 공 던지기
		if (arr[index] % 2 === 0) index -= l;
		// 홀수번 던졌으면 시계 방향으로 L 번째 있는 사람에게 공 던지기
		else index += l;

		// 1 ~ N 범위 안에 들어가도록 다시 수정
		if (index < 1) index += n;
		if (index > n) index -= n;

		// 공 던진 횟수 증가
		arr[index] += 1;
		// 총 횟수 갱신
		ans += 1;
	}

	return ans;
};

console.log(solution(input));