2 분 소요

1. 문제

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

  • 구현 문제
// 문제
알고리즘 유치원 선생님인 영희는 간식시간이 되자
아이들에게 사탕을 나누어 주려고 하였다.
하지만 욕심 많고 제멋대로인 유치원 아이들은
차례대로 받으라는 선생님의 말을 무시한 
마구잡이로 사탕을 집어 갔고 많은 사탕을 집어  아이가 있는가 하면
사탕을 거의 차지하지 못하고 우는 아이도 있었다.

말로 타일러도 아이들이 말을 듣지 않자 영희는  가지 놀이를 제안했다.
일단 모든 아이들이 원으로 둘러 앉는다.
그리고 모든 아이들은 동시에
자기가 가지고 있는 사탕의 절반을 오른쪽 아이에게 준다.
만약  결과 홀수개의 사탕을 가지게  아이가 있을 경우
선생님이  개를 보충해 짝수로 만들어 주기로 했다.
흥미로워 보이는  놀이에 아이들은 참여 했고
 과정을   거치자 자연스럽게 모든 아이들이
같은 수의 사탕을 가지게 되어 소란은 종료되었다.

자기가 가진 사탕의 반을 옆에 오른쪽에 앉은 아이에게 주는 과정과
선생님이 사탕을 보충해 주는 과정을 묶어서 1 순환이라고  
 번의 순환을 거치면
모든 아이들이 같은 수의 사탕을 가지게 되는지 계산 해보자.
, 처음부터 홀수개의 사탕을 가지고 있으면
선생님이 짝수로 보충을 먼저 해주며  경우 순환수에 들어가지 않는다.
선생님은 충분한 수의 사탕을 갖고 있다고 가정하자.

// 입력
입력은 표준입력(standard input) 통해 받아들인다.
입력의  줄에는 테스트 케이스의 개수 T가 주어진다.
각각의 테스트 케이스의  줄에는 아이의 인원 N (1  N  10) 주어지고
 다음 줄에는  아이들이 초기에 가지고 있는 사탕의 개수
Ci ( 1  i  N, 1  Ci  30) 주어진다.
분배  C1의 오른쪽에는 C2가, C2의 오른쪽에는 C3가……
같은 식으로 앉게 되며 CN의 오른쪽에는 C1이 앉게 된다.

// 출력
출력은 표준출력(standard output) 통하여 출력한다.
 테스트 케이스에 대하여
모든 아이가 같은 개수의 사탕을 가질 때까지  순환이 걸리는지 출력하시오.

// 예제 입력 1
4
5
2 4 7 8 9
1
9
6
10 5 13 2 7 8
4
3 4 4 3

// 예제 출력 1
6
0
4
0


2. 핵심 아이디어

  • 매개변수의 이해와 함수로 구조화해서 문제 해결


3. Python 문제풀이

import sys
input = sys.stdin.readline

def check(n, c) :
  for i in range(n) :
    if c[i] % 2 == 1 :
      c[i] += 1
  return len(set(c)) == 1

def teacher(n, c) :
  tmp_arr = [0 for i in range(n)]
  for idx in range(n) :
    if c[idx] % 2 :
      c[idx] += 1
    c[idx] //= 2
    tmp_arr[(idx+1) % n] = c[idx]

  for idx in range(n) :
    c[idx] += tmp_arr[idx]

  return c

def process() :
  n, c = int(input()), list(map(int, input().split()))
  cnt = 0
  while not check(n, c) :
    cnt += 1
    c = teacher(n, c)
  print(cnt)

for i in range(int(input())) :
  process()


4. Java 문제풀이


댓글남기기