백준 1018-체스판 다시 칠하기
Published:
개요
문제에서 요구하는 것
- m*n 크기의 나무판에서,8*8 사이즈의 체스판을 만들어낼 것
- 색 배치가 체스판과 같아야하며(흰, 검 반복)
- 다를 경우 재도색 해야하니, 가장 적은 재도색 횟수 구하기
방향성
최대 50*50(2500 칸의) 나무 판자.
8*8크기의 체스판 만들어야, 8*8 단위씩 검사를 43*43 번 해야함.
대략 64*2500. 브루트 포스로 해결가능하다.
난이도
solve.ac 난이도 : 실버 4 개인 난이도 : 2.8/5
문제에서 어려움
체스판의 문장이 띄어쓰기 없이 들어왔다. 어떻게 한글자씩 분리 할 것인가?
나의 해결책
Scanner객체의 next() 메소드 이용, 해당 문장의 문자에 charAt() 메소드로 접근.체스판이 올바르게 도색되었는지의 여부를 어떻게 판단하는가?
나의 해결책
바로 붙어있는(열과 행이 도합 1씩만 차이나는) 칸은 값이 다르다.
따라서 열과 행의 합이 홀수 인칸, 짝수인칸은 서로 가지고 있는 값이 달라야 올바름.
이를 만족하는지 여부를 판단하여 틀린칸(재도색이 필요한 칸)을 카운팅 하였음.
코드
//색칠 된 것이 틀렸는지 여부를 판단하는 코드.
//num에서 1이 넘어오면 첫칸이 검은 걸로, 0이 넘어오면 첫칸 하얀걸로 판단해서 작동.
public static int inTest(int x, int y, int num){
int count = 0;
for(int i = x; i< x+8; i++){
for(int j = y; j<y+8; j++){
if((i+j)%2== 1){
if(arr[i][j]!= num)
count++;
}
else{
if(arr[i][j]!= num) // 짝수 번째 칸이 하얀(검은)칸이면
count++;//수정해야하므로 count++
}
}
}
return count; // 틀린 개수 반환.
}
이문제 풀이에 필요한 지식.
보완해야 할 부분.
이러한 문제는 크게 이런 구조로 나뉜다.
- 기준으로 잡은 단위(대표하는 한자리 , 여기서는 최 좌측 꼭짓점) 에대하여 메소드를 수행
- 메소드 내부에서 해당 위치로 부터 좌표를 조작하며 문제를 풀어나가야함.
문제 풀이과정 중 2번에서 사소한 실수로 인해 디버깅에서 애를 좀 먹었다. 메소드 진입 전까지는 스무스하나, 그 뒤에 좌표 조작이 좀 복잡하다보니 생긴일, 비슷한 문제에대해서, 이를 신경써서 대처할 것.

