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 6년 전 1
#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개를 만들어 놓고
입력 받은것과 비교하면서 다른거를 카운트 했는데요 도데체 어디가 틀린거죠..?
제눈으로 아무리 봐도 맞는거 같고 여러 테스트 케이스 다 해봐도 잘 나오는데..