<aside> 1️⃣

1018번 체스판 다시 칠하기

정사각형으로 M*N개의 정사각형이 있는 보드가 흰색과 검은색으로 칠해져 있음

이 보드를 잘라서 8*8 크기의 체스판으로 만들려고 할 때 흑/백 칸이 번갈아 칠해져 있어야 함

보드가 체스판처럼 색칠되어 있지 않기 때문에 8*8 크기를 우선 잘라낸 후 다시 칠하려고 함

칠해야 하는 최소의 정사각형의 개수 구하기

</aside>

#include <stdio.h>

int main(){
  int N, M; 
  scanf("%d %d", &N, &M);
  char arr[51][51];

  for (int i = 0; i < N; i++) { //색칠된 값 입력받기
    scanf("%s", arr[i]);
  }

  int result = 64; //최대로 64칸을 다시 칠함

  //8*8으로 만들 수 있는 모든 보드 시작 위치 탐색
  for(int y = 0; y <= N-8; y++){
    for(int x = 0; x<=M-8; x++){
      int paintW = 0; //(y, x)에서 시작해 왼쪽 위가 흰색
      int paintB = 0; //(y, x)에서 시작해 왼쪽위가 검은색

      //8*8로 잘라낼 보드 검사
      for(int i = 0; i < 8; i++){
        for(int j=0; j<8; j++){
          //i+j가 짝수면 시작 색과 같도록

          //W로 시작
          if((i+j)%2 ==0){
            if(arr[y+i][x+j] != 'W')
              paintW++;
          }else{
            if(arr[y+i][x+j] != 'B')
              paintW++;
          }

          //B로 시작
          if((i+j)%2 ==0){
            if(arr[y+i][x+j] != 'B')
              paintB++;
          }else{
            if(arr[y+i][x+j] != 'W')
              paintB++;
          }
        }
      }
      //더 작은 거 선택
      int tempMin = (paintW < paintB) ? paintW:paintB;
      //결과 갱신
      if(tempMin < result)
        result = tempMin;
    }
  }
  printf("%d\\n", result);
  return 0;
}

image.png

<aside> 2️⃣

1072번 게임

몰래 게임을 하다 시선이 느껴질 때마다 코딩을 할 때, 코딩을 한 번 할 때마다 게임 실력이 향상됨

게임 횟수 X와 이긴 게임 Y가 주어질 때 승률 Z가 변하기 위해 게임을 최소 몇 번 더 해야하는지 구하기

</aside>

#include <stdio.h>

long long rate(long long x, long long y){ //승률(%) 구하는 함수
  return y * 100 / x; //일반 정수형 나눗셈의 경우 계속 0이 됨
}

int main(){
  long long X, Y;
  scanf("%lld %lld", &X, &Y);

  long long Z = rate(X, Y); //현재 승률 %

  if(Z >= 99){ //승률이 99 이상이면 더 올라가지 않음
    printf("-1");
    return 0;
  }

  //이진 탐색 통해 승률 바뀌는 경우 찾기
  long long left = 1;
  long long right = 1000000000;
  long long result = -1;

  while (left <= right) {
    long long mid = (left + right) / 2;
    long long newZ = rate(X + mid, Y + mid);

    if (newZ > Z) { //더 커지는 경우
      result = mid;
        right = mid - 1;   //더 작은 mid 탐색
    } else {
      left = mid + 1;    //더 큰 mid
    }
  }

  printf("%lld", result); //i(게임 횟수) 출력
  return 0;
}

image.png