티스토리 뷰
문제
알고리즘 유치원 선생님인 영희는 간식시간이 되자 아이들에게 사탕을 나누어 주려고 하였다. 하지만 욕심 많고 제멋대로인 유치원 아이들은 차례대로 받으라는 선생님의 말을 무시한 채 마구잡이로 사탕을 집어 갔고 많은 사탕을 집어 간 아이가 있는가 하면 사탕을 거의 차지하지 못하고 우는 아이도 있었다.
말로 타일러도 아이들이 말을 듣지 않자 영희는 한 가지 놀이를 제안했다. 일단 모든 아이들이 원으로 둘러 앉는다. 그리고 모든 아이들은 동시에 자기가 가지고 있는 사탕의 절반을 오른쪽 아이에게 준다. 만약 이 결과 홀수개의 사탕을 가지게 된 아이가 있을 경우 선생님이 한 개를 보충해 짝수로 만들어 주기로 했다. 흥미로워 보이는 이 놀이에 아이들은 참여 했고 이 과정을 몇 번 거치자 자연스럽게 모든 아이들이 같은 수의 사탕을 가지게 되어 소란은 종료되었다.
자기가 가진 사탕의 반을 옆에 오른쪽에 앉은 아이에게 주는 과정과 선생님이 사탕을 보충해 주는 과정을 묶어서 1 순환이라고 할 때 몇 번의 순환을 거치면 모든 아이들이 같은 수의 사탕을 가지게 되는지 계산 해보자. 단, 처음부터 홀수개의 사탕을 가지고 있으면 선생님이 짝수로 보충을 먼저 해주며 이 경우 순환수에 들어가지 않는다. 선생님은 충분한 수의 사탕을 갖고 있다고 가정하자.
입력
입력은 표준입력(standard input)을 통해 받아들인다. 입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 각각의 테스트 케이스의 첫 줄에는 아이의 인원 N (1 ≤ N ≤ 10)이 주어지고 그 다음 줄에는 각 아이들이 초기에 가지고 있는 사탕의 개수 Ci ( 1 ≤ i ≤ N, 1 ≤ Ci ≤ 30)가 주어진다. 분배 시 C1의 오른쪽에는 C2가, C2의 오른쪽에는 C3가…… 같은 식으로 앉게 되며 CN의 오른쪽에는 C1이 앉게 된다.
출력
출력은 표준출력(standard output)을 통하여 출력한다. 각 테스트 케이스에 대하여 모든 아이가 같은 개수의 사탕을 가질 때까지 몇 순환이 걸리는지 출력하시오.
import java.util.*;
import java.io.*;
public class Main {
static final int DICE_NUMBER = 6;
static final int DICE_COUNT = 4;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
for (int t = 0; t < T; t++) {
int N = Integer.parseInt(br.readLine());
int[] candies = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
candies[i] = Integer.valueOf(st.nextToken());
}
candies = makeEvenCandyCount(candies);
int count = 0;
while(true) {
if(isSameCandiesCount(candies)) {
break;
}
candies = Arrays.stream(candies).map(candy -> candy/2).toArray();
candies = candyWar(candies);
candies = makeEvenCandyCount(candies);
count++;
}
sb.append(count+"\\n");
}
System.out.println(sb.toString());
}
private static int[] makeEvenCandyCount(int[] candies) {
int[] newCandies = new int[candies.length];
for (int i = 0; i < candies.length; i++) {
int candyCount = candies[i];
if (candyCount % 2 == 1) {
candyCount += 1;
}
newCandies[i] = candyCount;
}
return newCandies;
}
private static boolean isSameCandiesCount(int[] candies) {
boolean result = true;
int count = candies[0];
for (int i = 1; i < candies.length; i++) {
if(count != candies[i]) {
result = false;
break;
}
}
return result;
}
private static int[] candyWar(int[] candies) {
int[] newCandies = candies.clone();
for (int i = 0; i < candies.length - 1; i++) {
newCandies[i + 1] += candies[i];
}
newCandies[0] += candies[candies.length - 1];
return newCandies;
}
}
'알고리즘' 카테고리의 다른 글
BOJ1461 도서관 java (0) | 2022.02.10 |
---|---|
BOJ2212 센서 java (0) | 2022.02.10 |
BOJ1092 배 java (0) | 2022.02.05 |
BOJ1922 네트워크 연결 java - 크루스칼 (0) | 2022.02.05 |
BOJ1197 최소 스패닝 트리 java - 크루스칼 (0) | 2022.02.05 |
- Total
- Today
- Yesterday
- 이팩티브 자바
- 정규표현식
- programmers
- kotest
- Spring Boot
- Olympiad
- AWS
- 코테
- 백준
- C++
- 객체지향
- 디자인 패턴
- 디자인패턴
- 클린 코드
- node.js
- MSA
- Algorithm
- Kotlin
- Java
- Spring
- 이펙티브 자바
- 프로그래머스
- BAEKJOON
- 클린 아키텍처
- Effective Java
- 알고리즘
- BOJ
- kkoon9
- 테라폼
- JPA
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |