반응형
LinkedIn 개발자로 성장하면서 남긴 발자취들을 확인하실 수 있습니다.
Github WWDC Student Challenge 및 Cherish, Tiramisul 등 개발한 앱들의 코드를 확인하실 수 있습니다.
개인 앱 : Cherish 내 마음을 들여다보는 시간, 체리시는 디자이너와 PM과 함께 진행 중인 1인 개발 프로젝트입니다.
10년 후, 20년 후 나는 어떤 스토리 텔러가 되어 있을지 궁금하다. 내가 만약에 아직 조금 더 탐구하고 싶은 게 있고, 궁금한 게 있다면, 그게 설사 지금 당장의 내 인생에 도움이 안 되는 것 같더라도 경험해보자. 그 경험들을 온전히 즐기며 내 것으로 만들고, 내 일에 녹여내고... 그러다보면 그 점들이 모여 나란 사람을 그려내는 선이 될 테니까.

Recent Posts
Recent Comments
Total
관리 메뉴

꿈꾸는리버리

[백준 알고리즘] 1018 체스판 다시 칠하기 본문

오뚝이 개발자/알고리즘

[백준 알고리즘] 1018 체스판 다시 칠하기

rriver2 2021. 12. 6. 09:45
반응형

문제:   https://www.acmicpc.net/problem/1018

 

1018번: 체스판 다시 칠하기

첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.

www.acmicpc.net

풀이방법:    

 

1) 체스판 8*8 크기로 자르기

지민이는 8×8 크기의 체스판으로 잘라낸 후에 몇 개의 정사각형을 다시 칠해야겠다고 생각했다.

-> 8*8 크기의 체스판을 잘라서 바꿔야 하는 칸만 바꿈

2) 화이트로 판이 시작했을 때, 블랙으로 판이 시작했을 때 나눠서 바꿔야 하는 칸의 수 세기

블랙으로 판이 시작됐다고 하자.

그렇다면 i와 j를 더한 값이 짝수인 경우에 B, 홀수인 경우에 W가 와야 한다. 

 i와 j를 더한 값이 짝수인 경우에 W, 홀수인 경우에 B가 왔을 때 count를 더해 준다. ( 화이트로 판이 시작했을 때에도 마찬가지 )

// 블랙으로 판이 시작할 때
                    if((k+p)%2 == 0 && input_chess[k][p] == 'W'){
                        bcount ++;
                    }else if((k+p)%2 == 1 && input_chess[k][p] == 'B'){
                        bcount ++;
                    }

3) count 최솟값 찾기

지금까지 count된 값 중에 제일 작은 값이 min_color_change이고, 만약 이것보다 작은 값이 count가 된다면 min_color_change의 값을 바꾼다.

 

if( min_color_change > wcount){
     min_color_change = wcount;
}
if( min_color_change > bcount){
     min_color_change = bcount;
}

 

작성한 코드는 다음과 같다. 

#include <iostream>
using namespace std;

int main() {
    int N,M;
    cin >> N >> M;
    char input_chess[N][M];
    int min_color_change = 100;
   
    for(int i = 0; i < N ; i++){
        for(int j = 0; j < M ; j++){
            cin >> input_chess[i][j];
        }
    }
    
    
    for(int i = 0; i < N-7 ; i++){
        for(int j = 0; j < M-7 ; j++){
            int wcount = 0;
            int bcount = 0;
            for(int k = i; k < i+8 ; k++){
                for(int p = j; p < j+8 ; p++){
                    
                    // 화이트로 판이 시작할 때
                    if((k+p)%2 == 0&& input_chess[k][p] == 'B'){
                        wcount ++;
                    }else if((k+p)%2 == 1 && input_chess[k][p] == 'W'){
                        wcount ++;
                    }

                    // 블랙으로 판이 시작할 때
                    if((k+p)%2 == 0 && input_chess[k][p] == 'W'){
                        bcount ++;
                    }else if((k+p)%2 == 1 && input_chess[k][p] == 'B'){
                        bcount ++;
                    }
                }
            }
            if( min_color_change > wcount){
                min_color_change = wcount;
            }
            if( min_color_change > bcount){
                min_color_change = bcount;
            }
        }
    }
   
    cout << min_color_change << "\n";
    
    
    return 0;
}

성공한 사진!    

  MEMO 

: 내가 멍청한 걸까..? 문제를 한번 읽었을 때는 내용이 이해가 안 갔다.. 

반응형
Comments