본문 바로가기
알고리즘/백준

1018번 문제 : 체스판 다시 칠하기

by son_i 2023. 3. 16.
728x90

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

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

일단 N행 M열만큼 배열 array[N][M]에 한 글자씩 저장하기 !

BufferedReadLine으로 한 줄씩 읽어와서 charAt으로 찢어서 저장.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		int N = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());
		char array[][] = new char[N][M];
		for(int i=0;i<N;i++) {
			String str = br.readLine();
			for(int j=0;j<M;j++) {
					array[i][j] =str.charAt(j);
			}
		}

 

내가 완성한 코드

package algorithm;

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

public class Main{
	public static void main(String[] args) throws  IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		int count = 0;
		int min=100;
		int N = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());
		char array[][] = new char[N][M];
		for(int i=0;i<N;i++) {
			String str = br.readLine();
			for(int j=0;j<M;j++) {
					array[i][j] =str.charAt(j);
			}
		}
		for(int q=0;q<=N-8;q++) {
			for(int w=0;w<=M-8;w++){
				char c = array[q][w];
				count=0;
				//System.out.println(q+" "+w);
						for(int j=q;j<q+7;j+=2) { //짝수행들 검사
							for(int k=w;k<w+7;k+=2) {//짝수열 검사
								if(c != array[j][k]) 
									count ++; 					
							}
							for(int o=w+1;o<=w+7;o+=2) {//홀수열 검사
								if(c == array[j][o]) 
									count ++;
							}
						}

						for(int j=q+1;j<=q+7;j+=2) { //홀수행들 검사
							for(int k=w+1;k<=w+7;k+=2) {//홀수열들 검사
								if(c != array[j][k]) 
									count ++;
									
							}
							for(int a=w;a<w+7;a+=2) {//짝수열들 검사
								if(c == array[j][a]) 
									count++;
							}
						}
						//System.out.println(count);
						if( min > count) {
							min = count;
							//System.out.println("min"+min);
						}
							
					}
			}
			System.out.println(min);
	}
}

맨 윗줄 첫칸을 기준으로 두고 다른 색을 칠하면 되는 문제인 줄 알았는데 문제 이해를 잘못했나보다

이거 때문에 글케 생각했는데..

아무튼 그래서 맨 윗 줄 첫 칸을 기준으로 두고 다른 칸들을 짝수행 + 짝수열/홀수열 , 홀수행 + 홀수열/짝수열 케이스로 나눠서 다 구했는데 예제 답안 중에 딱 하나만 안 됐었어 바로 이거

그래서 내 방법이 틀렸다는 걸 앙ㄹ게됐음

 

어떻게 해야하냐면 일단 첫 번째 정사각형이 흰색인 배열, 검은색인 2차원 배열을 만들어서 원본 입력된 배열과 비교해서 더 작은 차이를 가지는 값을 반환하면 된다 !

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;

class Main{
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int num = Integer.parseInt(br.readLine());
		String[] word = new String[num];
		
		//scanner.nextLine();
		for(int i=0;i<num;i++) {
			word[i] = br.readLine();
		}
		Arrays.sort(word, new Comparator<String>() {
			@Override
			public int compare(String o1, String o2) {
				if(o1.length() == o2.length()) {
					//단어 길이가 같으면 사전 순
					return o1.compareTo(o2);
				}
				else return o1.length() - o2.length();
			}
		});
		StringBuilder sb = new StringBuilder();
		sb.append(word[0]).append('\n');
		
		for(int i=1; i< num; i++) {
			if(!word[i].equals(word[i-1])) {
				sb.append(word[i]).append('\n');
			}
		}
			System.out.println(sb);
		//scanner.close();
	}
}

완떠엉..

'알고리즘 > 백준' 카테고리의 다른 글

1436번 문제 : 영화감독  (0) 2023.03.18
1259번 문제 : 팰린드롬수  (0) 2023.03.17
10250번 문제 : ACM호텔  (0) 2023.03.13
10814번 문제 : 나이순 정렬  (0) 2023.03.12
7568번 문제 : 덩치  (0) 2023.03.11