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

SeoYehJoon·2023년 10월 10일
0



전체코드이다 본인 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조건이 같아야 한다.


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


profile
책, 블로그 내용을 그대로 재정리하는 것은 가장 효율적인 시간 낭비 방법이다. 벨로그에 글을 쓸때는 직접 문제를 해결한 과정을 스크린샷을 이용해 정리하거나, 개념을 정리할때는 최소2,3개소스에서 이해한 지식을 정리한다.

0개의 댓글