• [1018] 백준 : 체스판 다시 칠하기(C++)

    2020. 4. 27.

    by. 데롱디롱

    728x90

     

    * 접근한 방식
    - 8*8의 네모칸을 N*M의 네모 안에서 우측 혹은 하단으로 이동하며 검사
    - 8*8의 네모칸의 (0,0)가 B인지 W인지를 start변수에 저장한 후, 8*8안의 각각의 행과 열을 검사

    char start = board[i][j];

    (8*8사각형 기준)
    ☞ 행, 열은 8*8사각형의 행과 열을 의미)


    - 행이 짝수인 경우, 
       └ 열이 짝수면, start와 같아야함.
            따라서 start와 다른 경우 고쳐야하므로 num++
       └ 열이 홀수면, start와 달라야함.
            따라서 start와 같은 경우 고쳐야하므로 num++

    - 행이 홀수인 경우,
       └ 열이 짝수면, start와 달라야함.
            따라서 start와 같은 경우 고쳐야하므로 num++
       └ 열이 홀수면, start와 같아야함.
            따라서 start와 다른 경우 고쳐야하므로 num++

     

    * 생각하지 못한 점
    - (0,0)을 기준으로하여 나머지칸들을 고쳤으나 (0,0)만 고치면 되는 경우가 있을 수도 있음
       ☞ (0,0)이 'B이어야 할 때'와  'W이어야 할 때'의 경우의 수를 모두 세서,
           둘 중 작은 것을 그 8*8사각형에서의 최소 변화 횟수로 하자

     

    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
    
    int main() {
    	int N, M;
    	cin >> N >> M;
    	vector<string> board(N);
    	int result = 0;
    
    	// 각 칸의 색 입력받기
    	for (int i = 0; i < N; i++)
    	{
    
    		cin >> board[i];
    	}
    
    	// 8*8네모의 이동
    	for (int i = 0; i <= N-8; i++)
    	{
    		for (int j = 0; j <= M - 8; j++)
    		{
    			char start = 'B';
    			int num = 0;
    			// 네모 안에 틀린색 개수 체크
    			for (int r = 0; r < 8; r++)
    				for (int c = 0; c < 8; c++)
    				{
    					if (r % 2 == 0)
    					{
    						if (c % 2 != 0)
    						{
    							if (start == board[i + r][j + c])
    								num++;
    						}
    						else
    						{
    							if (start != board[i + r][j + c])
    								num++;
    						}
    					}
    					else
    					{
    						if (c % 2 != 0)
    						{
    							if (start != board[i + r][j + c])
    								num++;
    						}
    						else
    						{
    							if (start == board[i + r][j + c])
    								num++;
    						}
    					}
    				}
    
    			if (i == 0 && j == 0)
    				result = num;
    			else if (num < result)
    				result = num;
    
    			start = 'W';
    			num = 0;
    			// 네모 안에 틀린색 개수 체크
    			for (int r = 0; r < 8; r++)
    				for (int c = 0; c < 8; c++)
    				{
    					if (r % 2 == 0)
    					{
    						if (c % 2 != 0)
    						{
    							if (start == board[i + r][j + c])
    								num++;
    						}
    						else
    						{
    							if (start != board[i + r][j + c])
    								num++;
    						}
    					}
    					else
    					{
    						if (c % 2 != 0)
    						{
    							if (start != board[i + r][j + c])
    								num++;
    						}
    						else
    						{
    							if (start == board[i + r][j + c])
    								num++;
    						}
    					}
    				}
    
    			if (num < result)
    				result = num;
    		}
    	}
    	
    	// 다시 칠해야 하는 개수
    	cout << result;
    }

     

    - 코드가 좀... 반복이 많이 되는 것 같은데, 나중에 이걸 줄여봐야겠다.

    '알고리즘 풀이 > 백준' 카테고리의 다른 글

    [2108] 백준 : 통계학(C++)  (0) 2020.04.30
    [1436] 백준 : 영화감독 숌(C++)  (0) 2020.04.27
    [7568] 백준 : 덩치(C++)  (0) 2020.04.27
    [2231] 백준 : 분해합(C++)  (0) 2020.04.27
    [2798] 백준 : 블랙잭(C++)  (0) 2020.04.27

    댓글