hahn

단계별로 풀어보기(브루트 포스 - 체스판 다시 칠하기) 본문

코딩테스트 연습/백준(JAVA)

단계별로 풀어보기(브루트 포스 - 체스판 다시 칠하기)

hahn 2021. 9. 14. 13:35
728x90
반응형

1018번: 체스판 다시 칠하기 (acmicpc.net)

 

1018번: 체스판 다시 칠하기

첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.

www.acmicpc.net

http://boj.kr/88c09612327e4f2ca1f9bd6583d86a5c

 

공유 소스 보기

 

www.acmicpc.net

더보기
import java.util.Scanner;

class Main{
    
    public static void main(String[] args){
        
        Scanner sc = new Scanner(System.in);
		
		int rowCount, columnCount,
			startW, startB, result;
		
		rowCount = sc.nextInt();
		columnCount = sc.nextInt();
		result = rowCount * columnCount;
		String compare = "WBWBWBWB";
		
		String[] arr = new String[rowCount];
		
		for(int i = 0; i < arr.length; i++) {
			
			arr[i] = sc.next();
			
		}
		
		for(int i = 0; i < arr.length - 7; i++) {
			
			for(int k = 0; k < columnCount - 7; k++) {
				
				startW = 0;
				
				startB =0;
				
				for(int j = i; j < i + 8; j++) {
				
					for(int l = k; l < k + 8; l++) {
						
						if(j % 2 == 0 ? compare.charAt(l - k) == arr[j].charAt(l) : compare.charAt(l - k) != arr[j].charAt(l)) {
							startW++;
						}else {
							startB++;
						}
						
					}
					
				}
				
				if(result > startW) result = startW;
				if(result > startB) result = startB;
				
			}
			
		}
		
		System.out.println(result);
        
    }
    
}

 

문제를 읽어보고 음.. 좀 까다롭다고 생각했다.

 

WBWBWBWB

BWBWBWBW

WBWBWBWB

BWBWBWBW

WBWBWBWB

BWBWBWBW

WBWBWBWB

BWBWBWBW

 

or

 

BWBWBWBW

WBWBWBWB

BWBWBWBW

WBWBWBWB

BWBWBWBW

WBWBWBWB

BWBWBWBW

WBWBWBWB

 

위와 같은 형태의 체스판을 얻는 게 목적이므로

 

저걸 원형으로 두고 각 부분과 비교하여

 

최솟값을 구하면 되겠다 생각했고,

 

일단 블록을 나누는 것과 원형과 비교하는 것을

 

구현해야겠다고 결론을 내렸다.

 

for문으로 나누고 원형 비교는

 

WBWBWBWB 기준으로 두고

 

삼항 연산자와 mod 연산을 응용하여 카운트하게 했다.

 

구현하고 나니 답이 이상하게 나와서 뭐가 문제인 건가 생각해봤는데

 

for문 순서를 하나 잘못했었다.

 

중첩 for문 쓰니까 가끔 헷갈리는 경우가 있다 ㅋㅋ;

728x90
반응형