[백준 1018번: 체스판 다시 칠하기] java 풀이

Elmo·2022년 7월 23일
0

[백준] 알고리즘

목록 보기
5/39

간단하지만 생각보다 헤매느라 시간을 잡아먹은 문제...
특히 자바는 익숙하지 않아서 scanner를 사용하지않고 받는 부분에서 약간 헷갈렸다.

요약하자면,

  • B로 시작하는 88체스판과 W로 시작하는 88체스판 두 개의 배열을 준비함.

  • 첫 시작 좌표를 (i , j)로 잡는다.

  • 시작좌표 (i , j)로부터 8*8만큼 체스판을 떼어내서 1)의 배열과 비교해서 바뀌는 부분의 개수를 센다.

  • 위 과정을 좌표를 한칸씩 이동하면서 전부 비교함(브루트 포스 알고리즘)

  • 가장 작은 값을 출력함.

🔑 java 풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	char Wstart[][]= {{'W','B','W','B','W','B','W','B'},
					  {'B','W','B','W','B','W','B','W'},
					  {'W','B','W','B','W','B','W','B'},
  					  {'B','W','B','W','B','W','B','W'},
					  {'W','B','W','B','W','B','W','B'},
					  {'B','W','B','W','B','W','B','W'},
					  {'W','B','W','B','W','B','W','B'},
					  {'B','W','B','W','B','W','B','W'}};
	char Bstart[][]= {{'B','W','B','W','B','W','B','W'},
						{'W','B','W','B','W','B','W','B'},
						{'B','W','B','W','B','W','B','W'},
						{'W','B','W','B','W','B','W','B'},
						{'B','W','B','W','B','W','B','W'},
						{'W','B','W','B','W','B','W','B'},
						{'B','W','B','W','B','W','B','W'},
						{'W','B','W','B','W','B','W','B'}};
	int TestChess(int i,int j,char[][] chess) {
		int changeB=0,changeW=0;
		char test[][];
		test = Bstart.clone();
		for(int x=i;x<i+8; x++){
			for(int y=j; y<j+8; y++) {
				if(chess[x][y]!=test[x-i][y-j])
					changeB++;
			}	
		}
		test = Wstart.clone();
		for(int x=i;x<i+8; x++){
			for(int y=j; y<j+8; y++) {
				if(chess[x][y]!=test[x-i][y-j])
					changeW++;
			}	
		}
		return Math.min(changeW, changeB);
	}
	
	public static void main(String[] args)throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st= new StringTokenizer(br.readLine()," ");
		Main Main = new Main();
		
		int N=Integer.parseInt(st.nextToken());
		int M=Integer.parseInt(st.nextToken());
		char[][] chess = new char[N][M];
		for(int i=0; i<N; i++)
			chess[i]=br.readLine().toCharArray();
		
		int min=2500;//최대값으로 설정 50*50
		int result;
		for(int i=0; i<=N-8; i++) {
			for(int j=0; j<=M-8; j++) {
				result=Main.TestChess(i, j, chess);
				if(min>result)
					min=result;
			}
		}
		System.out.println(min);
	
	}

}

내가 간과했던 부분으로 인해 시간을 잡아먹었다

  • 초기 min값은 가장 큰 값으로 설정해야함(이 당연한걸...ㅠ)

  • 시작 좌표 (i , j)는 0~N-8 과 0~M-8 까지 설정해야함

  • 비교는 B로 시작하는 경우와 W로 시작하는 경우 둘다 해야함.(첫 시작 문자는 고정이라고 착각하면 안됨)

이 부분을 꼭 참고했으면 한다.


하.. 코딩 오랜만에 하려니깐 힘드네

profile
엘모는 즐거워

0개의 댓글