[백준풀이]1018 체스판 (자바)

SeoYehJoon·2023년 10월 10일



전체코드이다 본인 IDE에 복사 붙여넣기 해서 보면 편하다.

package baek_1018;

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

public class Chessboard 
{
	public static void main(String[] args) throws IOException
	{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int N= Integer.parseInt(st.nextToken()); //y
		int M = Integer.parseInt(st.nextToken()); //x
		char[][] board = new char[N][M];
		
		for(int i=0;i<N;i++)
		{
			String temp = br.readLine();
			for(int j=0;j<M;j++)
			{
				board[i][j] = temp.charAt(j);
			}
		}
		
		int min_count =32;
		for(int i=0;i<=N-8;i++)//y축
		{
			for(int j=0;j<=M-8;j++)//x축
			{
				int temp_count=0;
				//여기서부터 보드하나 검사
				int ycount=0;
				char dontsame = board[i][j]; 
				
				
				
				int case2 =1;
				while(case2<=2)
				{
					temp_count =0;
					if(case2==1)
					{
						if(board[i][j]=='B')dontsame='W';
						else if(board[i][j]=='W') dontsame='B';
					}
					else if(case2==2)
					{
						if(board[i][j]=='B')dontsame='B';
						else if(board[i][j]=='W') dontsame='W';
					}
					case2++;
					
					for(int p=i;p<i+8;p++)
					{
						for(int q=j;q<j+8;q++)
						{
							//System.out.printf("board[%d][%d]: %c\n",p,q, board[p][q]);
							//System.out.printf("dontsame: %c\n", dontsame);
							if(board[p][q]==dontsame)
							{	
								temp_count++;
							}
							if(dontsame =='B')dontsame='W';
							else if(dontsame =='W')dontsame='B';
						}
						if(dontsame =='B')dontsame='W';
						else if(dontsame =='W')dontsame='B';
					}
					//System.out.println("-----------------------temp_count :" + temp_count);
				
					if(temp_count<min_count) 
					{
						min_count = temp_count;
						//System.out.println("======================================temp_count: "+temp_count);
					}
				}
			}
		}
		System.out.println(min_count);
	}
}




코드 풀이


좌우값을 입력받고 2중리스트에 W B을 채워넣는다.


4중for문의 첫번째, 두번째 for 문


보드를 자른다고 했는데 어딜 잘라야 최적인지 모르겠다. 따라서 8*8 크기로 자를수 있는 모든 경우의 수를 잘라보자


이 밑의 사진들은 특정 8*8보드 하나를 검사하는 코드


그림에 써놨듯이 잘라진 보드의 첫번째칸(board[0][0])이 'WHITE'인케이스와 'BLACK'인 케이스 모두 고려해 주어야 한다. 저걸 안했더니

이 테스트셋을 넣었을때 오류가 뜨더라. 왜냐?

위그림과 같이 이상적인 체스판은 처음과 마지막 색깔이 같다. 그런데 예제입력4 의 테스트셋을 보면 맨마지막이 'W'인걸 볼 수 있다 그러므로 처음 색깔도 W로 칠해줘야 최소의 수정횟수인 31이나온다.



이제 옆칸과 같은지 비교하는 구문을 보자


행을 바꾸기전 dontsame(이것과 같으면 색칠카운트 +1)을 바꾸는 이유는

이상적인 체스판인 경우 위처럼 마지막색과 다음줄 첫번째색이 똑같다. 따라서 dontsame조건이 같아야 한다.


현재 보드의 수정횟수가 최소인지 확인


0개의 댓글