spring7424   2년 전

조금 코드가 복잡할 수 있습니다 ㅠ.ㅠ 실력이 부족해서 이해해주세요.

처음에 입력받은 숫자 두 개를 x,y에다가 저장한 후 그에 맞춰서 이차원 배열 board를 동적 할당으로 만들었습니다.

이후에 board를 B,W를 각각 0,1로 구분하여 이차원 배열 board에다가 입력, 저장하였습니다.

어떤 시작지점[a,b]를 설정하면 그로부터 [a+7,b+7]까지를 하나의 체스판으로 가정하고 고쳐야 하는 블록 갯수를 세면 되기 때문에 

21번째, 22번째줄 for문에서 x-7,y-7로 잡고 돌렸습니다.

이후 i,j를 체스판의 시작 지점으로 잡고 i,j를 기준으로 홀수인 경우, 짝수인 경우를 나누어 64개의 블록을 검사해줍니다.

제일 처음, 즉 시작지점이 [0,0]인 경우는 answer값이 초기화가 안되어 있기 때문에 answer에다가 count를 바로 대입합니다.

이후는 count가 answer보다 작은 경우에만 answer에다가 count를 대입하였습니다.


조금 복잡하지만, 도저히 제 스스로는 무엇때문에 값이 안나오는지 모르겠습니다. 

(VS에서 테스트 케이스도 여러 개 입력해봤는데, 전부 정상으로 나옵니다)

도움..부탁드립니다!

sjyfantasy   2년 전

체스판이 같은 규격에 나올수 있는 값이 2개입니다.

midascha   2년 전

spring7424의 코드에는 문제가 없는거 같습니다.

단지, 문제의 의도와 조금 벗어났을 뿐인거 같습니다.

계속 틀려서 뭐가 문제인지 문제를 찾다고 발견했습니다.

위의 설명과 같이 "체스판이 같은 규격에 나올수 있는 값이 2개입니다." 라는 말이 Key입니다.

void WBcount(int p, int q, char startColor, char nextColor) {
int ni, nj;
int cnt = 0;

for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
//짝홀로 결정
ni = i + p;
nj = j + q;
if (j % 2 == 0) {
if (startColor != map[ni][nj])
cnt++;
}
else {
if (nextColor != map[ni][nj])
cnt++;
}
}
if (startColor == 'B') {
startColor = 'W';
nextColor = 'B';
}
else {
startColor = 'B';
nextColor = 'W';
}
}
if (myMin > cnt)
myMin = cnt;
}

for (int p = 0; p < m-7; p++) {
   for (int q = 0; q < n-7; q++) {
       WBcount(p, q, 'W', 'B');
       WBcount(p, q, 'B', 'W');
    }
}

spring7424   2년 전

안녕하세요. 글쓴이 본인입니다.

제가 곰곰히 생각을 해봤는데 체스판 시작 색이 흰색일 때, 검정색일 때 총 2가지로 구분해서 나누면 되는게 맞을까요?

말씀하신 말이 그 말인지를 잘 모르겠습니다 ㅠㅠ

sjyfantasy   2년 전

네 맞아요~

시작색이 W일때랑 B일 때랑 비교하셔야 되요

spring7424   2년 전

그럼 위에 반복문을 케이스를 나누어서 두번 돌려보면 되겠네요. 감사합니다!

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