Backend
home
🍬

[백준] The candy war

생성일
2025/06/11 14:05
태그
BaekJoon
게시일
2025/06/11
최종 편집 일시
2025/06/11 14:16

문제

해결 방안 고민

사탕의 개수를 짝수개로 맞추고, 모든 학생의 사탕 개수를 같게 하고, 옆에 있는 학생에게 사탕 반개씩 주는 것이 문제의 요구사항이다.
문제는 이해했으나 조건을 어떻게 구현해야 할지 좀처럼 감이 잡히지 않았다.

해결 방법

각각의 조건들을 함수로 만들어서 진행해야 한다.
newCandies[(i + 1) % length] = candies[i] / 2 + candies[(i + 1) % length] / 2;
이 부분이 문제풀이의 핵심이다. 배열의 인덱스와 나머지 연산을 활용하면 조건에 맞게 순환에 대한 계산을 진행할 수 있다.

코드

package algo250611; import java.io.*; import java.util.*; // 백준 - The candy war(실버 5) public class Baek9037 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 테스트 케이스 int T = Integer.parseInt(br.readLine()); for (int i = 0; i < T; i++) { int N = Integer.parseInt(br.readLine()); int[] C = new int[N]; StringTokenizer st = new StringTokenizer(br.readLine()); for (int j = 0; j < N; j++) { C[j] = Integer.parseInt(st.nextToken()); } int count = 0; while (true) { C = checkCandy(C); // 사탕 짝수개 맞춘다. if (isSameCandy(C)) { break; } C = roundCandy(C); count++; } System.out.println(count); } } // 사탕 짝수개로 맞추기 private static int[] checkCandy(int[] candies) { for (int i = 0; i < candies.length; i++) { if (candies[i] % 2 == 1) { candies[i]++; } } return candies; } // 모든 학생의 사탕 개수 같게 하기 private static boolean isSameCandy(int[] candies) { for (int candy : candies) { // 모든 사탕은 같아야 하므로 if (candy != candies[0]) { return false; } } return true; } // 사탕 순환 private static int[] roundCandy(int[] candies) { int length = candies.length; int[] newCandies = new int[length]; for (int i = 0; i < length; i++) { // 맨끝에 있는 학생은 맨 처음 학생으로 줘야 하기에 뒤에 길이만큼 나눈 나머지로 처리 newCandies[(i + 1) % length] = candies[i] / 2 + candies[(i + 1) % length] / 2; } return newCandies; } }
Java
복사

느낀 점

요즘 들어 알고리즘 공부가 더 어려워지는 느낌이 든다. 처음에는 쉬운 문제부터 접근하다 보니 그리 오랜 시간이 흐르지 않았지만 점점 해결하는 데 있어 시간이 길어진다. 답답함을 느낄 때가 많고 도저히 이해가 되지 않는 경우 해설집이나 다른 블로그를 참고하여 문제에 대한 접근법을 익히고자 노력한다. 알고리즘 공부는 아무리 해도 쉽게 늘지를 않으니 계속 이렇게 하는 게 맞나 싶기도 하지만 그렇다고 중간에 포기하면 이제까지 공부한 게 다 물거품이 될 것이다. 어차피 시작한 거 끝을 봐야 하지 않겠는가.