[C++] Kick Start 2021 Round H - Painter

Kim Nahyeong·2022년 4월 6일
0

Kick Start

목록 보기
1/3

#include <iostream>
#include <vector>
using namespace std;

int T, N;
vector<int> R;
vector<int> Y;
vector<int> B;
string P;
int main(){
  ios::sync_with_stdio(false);
  std::cin.tie(0);
  std::cout.tie(0);

  cin >> T;

  for(int i = 1; i <= T; i++){
    int cnt = 0;
    R.clear(); Y.clear(); B.clear(); // 벡터 지우기

    bool flag; // true면 현재 1
    cin >> N >> P;

    for(int j = 0; j < N; j++){
      // 1이 있으면 해당 색의 칠이 필요한 것
      if(P[j] == 'U'){
        R.push_back(0);
        Y.push_back(0);
        B.push_back(0);
      } else if(P[j] == 'R'){
        R.push_back(1);
        Y.push_back(0);
        B.push_back(0);
      } else if(P[j] == 'Y'){
        R.push_back(0);
        Y.push_back(1);
        B.push_back(0);
      } else if(P[j] == 'B'){
        R.push_back(0);
        Y.push_back(0);
        B.push_back(1);
      } else if(P[j] == 'O'){
        R.push_back(1);
        Y.push_back(1);
        B.push_back(0);
      } else if(P[j] == 'P'){
        R.push_back(1);
        Y.push_back(0);
        B.push_back(1);
      } else if(P[j] == 'G'){
        R.push_back(0);
        Y.push_back(1);
        B.push_back(1);
      }  else if(P[j] == 'A'){
        R.push_back(1);
        Y.push_back(1);
        B.push_back(1);
      }
    }

    // for(int j = 0; j < N; j++){
    //   printf("%d ", Y[j]);
    // }
    // printf("\n");
    // for(int j = 0; j < N; j++){
    //   printf("%d ", B[j]);
    // }

    if(R[0] == 1){
      flag = true;
      cnt++;
    } else {
      flag = false;
    }

    for(int j = 0; j < N; j++){
      if(R[j] == 0 && flag){
        flag = false;
      } else if(R[j] == 1 && !flag){
        flag = true;
        cnt++;
      }
    }

    if(Y[0] == 1){
      flag = true;
      cnt++;
    } else {
      flag = false;
    }

    for(int j = 0; j < N; j++){
      if(Y[j] == 0 && flag){
        flag = false;
      } else if(Y[j] == 1 && !flag){
        flag = true;
        cnt++;
      }
    }

    if(B[0] == 1){
      flag = true;
      cnt++;
    } else {
      flag = false;
    }

    for(int j = 0; j < N; j++){
      if(B[j] == 0 && flag){
        flag = false;
      } else if(B[j] == 1 && !flag){
        flag = true;
        cnt++;
      }
    }

    printf("Case #%d: %d\n", i, cnt);
  }

  return 0;
}

배열을 이용해서 푼 문제.

채색을 해 나가는데 무조건 이어지게 채색을 해야한다.

말로 설명하기 힘들어서 풀이를 위해 끼적인 것 첨부

색은 RYB로 이루어지며 모든 경우의 수에 따라 해당 색이 필요한 경우(칠해진 경우)를 배열에 담는다.

동적 배열을 사용하여 메모리 사용을 아끼기 위해 vector를 이용하였다.

그리고 1이 이어진 경우 +1을 하기 위해 flag를 사용해서 1의 연속성 여부를 검사하여 카운트 해주었다.

0개의 댓글

관련 채용 정보