본문 바로가기

Algorithm/Implementation

(C++) - 백준(BOJ) 9037 : The candy war

반응형

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

 

9037번: The candy war

입력은 표준입력(standard input)을 통해 받아들인다. 입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 각각의 테스트 케이스의 첫 줄에는 아이의 인원 N (1 ≤ N ≤ 10)이 주어지고 그 다음 줄에

www.acmicpc.net

구현 문제였습니다.

📕 풀이방법

📔 입력 및 초기화

test case t, 학생 수 n, candy 정보 vector candyState, 정답을 출력할 변수 cycle를 선언한 뒤 적절히 입력받습니다.

📔 풀이과정

놀이대로 구현하면 됩니다.

1. 먼저 홀수개를 가진 아이에게 1개씩 사탕을 줍니다.

2. while loop를 모든 아이가 사탕을 동일하게 가지지 못한 동안 수행합니다.

   2-1. 오른쪽 사람에게 사탕의 절반을 줍니다. 

   2-2. 홀수개를 가진 아이에게 1개씩 사탕을 줍니다.

 

📔 정답출력

cycle을 출력합니다.


📕 Code

#include <bits/stdc++.h>
using namespace std;
int t, n, c, cycle;
vector <int> candyState;

bool isAllHaveSameCandy(){
  for(int i = 0; i < n - 1; i++)
    if(candyState[i] != candyState[i+1]) 
      return false;
  return true;
}

void giveCandyToRightChild(){
  vector <int> tmp(n);
  for(int i = 0; i < n - 1; i++){
    tmp[i+1] = candyState[i] / 2;
  }
  tmp[0] = candyState[n - 1] / 2;
  for(int i = 0; i < n; i++){
    candyState[i] = candyState[i] / 2 + tmp[i];
  }
}

void giveCandyWhoHasOdd(){
  for(int i = 0; i < n; i++)
    if(candyState[i] % 2) 
      candyState[i]++;
}

int main(){
  cin >> t;
  
  while(t--){
    cin >> n;
    cycle = 0;
    candyState.resize(n);
    for(int i = 0; i < n; i++) cin >> candyState[i];

    giveCandyWhoHasOdd();
    while(!isAllHaveSameCandy()){
      cycle++;
      giveCandyToRightChild();
      giveCandyWhoHasOdd();
    }
    cout << cycle << '\n';
  }
}