<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;
}

<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;
}
