simsimjae   4년 전

#include<algorithm>

#include<iostream>

using namespace std;

int input[51][51];

int white[8][8];

int black[8][8];

int main()

{

    int n,m;

    cin>>n>>m;

    

    for(int i=0; i<n; i++)

    {

        for(int j=0; j<m; j++)

        {

            char temp;cin>>temp;

            input[i][j] = temp == 'W' ? 1:0;

        }

    }

    

    for(int i=0; i<8; i++)

    {

        for(int j=0; j<8; j++)

        {

            white[i][j] = (i+j)%2 ==0? 1:0;

            black[i][j] = (i+j)%2 ==0? 0:1;

        }

    }

    

    int minn=400000000;

    for(int x=0; x<m-7; x++)

    {

        for(int y=0; y<n-7; y++)

        {

            int cnt1=0;

            int cnt2=0;

            for(int i=x; i<x+8; i++)

            {

                for(int j=y; j<y+8; j++)

                {

                    if(white[i-x][j-y] != input[i][j]) cnt1++;

                    if(black[i-x][j-y] != input[i][j]) cnt2++;

                }

            }

            minn = min(minn,min(cnt1,cnt2));

        }

    }

    cout << minn<<endl;

    

    return 0;

}


맨 왼쪽 상단이 화이트일때, 맨왼쪽 상단이 블랙일때 정답지 8*8배열 2개를 만들어 놓고

입력 받은것과 비교하면서 다른거를 카운트 했는데요 도데체 어디가 틀린거죠..?


제눈으로 아무리 봐도 맞는거 같고 여러 테스트 케이스 다 해봐도 잘 나오는데..


djm03178   4년 전

2차원 배열의 앞뒤 인덱스를 헷갈리셨네요.

처음 입력을 받을 때에 보면 분명히 index[n][m], 즉, [세로][가로]로 맞춰서 돌리고 있습니다.

그런데 비교하는 쪽에 가면, for (int x = 0; x<m - 7; x++) for (int y = 0; y<n - 7; y++) 과 같이 x를 가로에, y를 세로에 맞춰서 돌리고 있는데, for (int i = x; i<x + 8; i++) for (int j = y; j<y + 8; j++) 에서 i, j가 각각 x와 y에 대응하게 돌고 있으며,

if (white[i - x][j - y] != input[i][j]) cnt1++;

if (black[i - x][j - y] != input[i][j]) cnt2++;

에서도 여전히 i, j 순서로 돌고 있으니, 상하와 좌우가 뒤바뀐 채로 검사를 진행하고 있습니다.

평면을 2차원 배열로 표현하는 문제에 있어, 자신만의 가로, 세로 순서를 확실히 해두는 것이 좋습니다.

혹시 필요하다면, 반레도 드립니다.

8 9
WWWWWWBWB
WWWWWWWBW
WWWWWWBWB
WWWWWWWBW
WWWWWWBWB
WWWWWWWBW
WWWWWWBWB
WWWWWWWBW

정답: 20

코드: 24

simsimjae   4년 전

와 진짜 감사합니다 아래 포문에서 m 이랑 n 만 바꾸니까 바로 되네요..

이런건 진짜 제눈으로 봤으면 못찾았을듯 ㅜㅜ


댓글을 작성하려면 로그인해야 합니다.