-
[백준/BOJ] 1018번 : 체스판 다시 칠하기 (JAVA / 자바)백준 2022. 2. 15. 11:42
안녕하세요~ 코딩하는 코알못 코메인입니다.
https://www.acmicpc.net/problem/1018
- 문제 -
난이도 실버 5 문제이다.
자바에서 입력방식은 scanner와 bufferedreader가 있다.
자바를 초반에 접하면 처음에 배우는 입력은 scanner이다. scanner가 bufferedreader보다 편하지만 속도가 느리다.
bufferedreader는 무조건 문자열로 받아오기때문에 정수형이나 실수형 변수에 저장하기 위해서는 입력과 형변환을 해줘야한다.
더 자세한 내용은 아래 글 참고 하면 좋다.
풀이 방법
풀이 방법은 생각보다 심플하다.(그저 내가 헤매고 또 헤매고... 시간들여 오래 걸렸을 뿐...)
여담이지만 처음엔 대체 어떻게 이걸 체스판 형태로 만들어서 색칠한 최솟값을 구해야 할지 생각하는데 시간을 많이 들였다. 맨처음으로 생각이든 방법은 WH가 순서대로 나열되어 있지 않은 경우에 수를 세서 확인하는 방법이지만 이건 성립하지 않는단걸 알았다... 이런식으로 여러가지 생각을 해봤고, 결국 최종적으로 생각해낸 방식이 체스판 보드를 만들고 입력보드와 비교를 하는 것이다.
체스판 보드를 만들고, 입력 보드를 비교한다.
주의 할 점
1. 체스판 보드는 맨위 왼쪽 끝이 흰색으로 시작하던가, 검은색으로 시작하던가 2가지가 있다. 이건 그냥 둘다 만든다.
2. 입력보드는 8x8이 아니라 그것보다 크거나 같은 보드이다. 그렇기때문에 비교할때는 맨위, 인쪽 끝에서부터 8x8크기를 비교하면서 옆이나 아래쪽으로 다 훑는다.(훑기위한 for문 옆, 아래 2개와 보드끼리 비교하기 위한 for문 2개 총 4개가 필요하다.)
보드판은 문자열 배열을 사용해 만들었다. 배열을 만들고 각 배열에 저장된 문자열을 한글자씩 비교해서 다른 개수를 찾는다. 흰 보드와 검은 보드 둘다 비교해서 적은 값을 구한다.(이차원배열을 사용해도 된다.)
8x8보다 큰 보드가 입력이 되면 비교할 경우의 수가 많이 나오기 때문에 흰보드 검은 보드 중 작은 값을 뽑으면 그 값을 현재 최솟값과 다시 비교해서 작은 수를 저장하고, 모든 반복문이 끝났을 때 출력한다.
코드로 보자.
-풀이-
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 N = Integer.parseInt(st.nextToken()); int M = Integer.parseInt(st.nextToken()); //입력 보드 String[] arr = new String[N]; //흰보드와 검은보드 String[] Wboard = new String[8]; String[] Bboard = new String[8]; //입력보드에 입력값 저장 for(int i = 0; i < N; i++) { arr[i] = br.readLine(); } //흰보드 만들기 for(int i = 0; i < 8; i++) { if(i % 2 == 0) Wboard[i] = "WBWBWBWB"; else Wboard[i] = "BWBWBWBW"; } //검은보드 만들기 for(int i = 0; i < 8; i++) { if(i % 2 == 0) Bboard[i] = "BWBWBWBW"; else Bboard[i] = "WBWBWBWB"; } //모든 경우의 수중 제일 작은 값을 저장할 변수. 최솟값을 비교하기 위해서 나올 수 있는 제일 큰 값을 저장. //8x8이기때문에 64가 제일 나올 수 있는 큰 수 이다. //(완전 다른 두 보드를 비교하기 때문에 사실상 유효한 수는 절반인 32이다.) int min = 64; //보드르 비교하기 위한 for문 4개. for(int i = 0; i < (N - 7); i++) { for(int j = 0; j < (M - 7); j++) { int Wcount = 0; int Bcount = 0; for(int k = 0; k < 8; k++) { for(int l = 0; l < 8; l++) { if(Wboard[k].charAt(l) != arr[k + i].charAt(l + j)) Wcount++; if(Bboard[k].charAt(l) != arr[k + i].charAt(l + j)) Bcount++; } } min = Math.min(min, Math.min(Wcount, Bcount)); } } System.out.println(min); } }
-결과-
아직 코딩 공부가 부족한 필자라 설명과 풀이 방법이 많이 미흡할 수 있다. 코딩 고수분들은 보시고 문제점이 있다면 댓글로 말해주시면 감사한 마음으로 참고 수정 하겠습니다.
'백준' 카테고리의 다른 글
[백준/BOJ] 10950번 : A+B - 3 (JAVA / 자바) (0) 2022.02.15 [백준/BOJ] 10886번 : 0 = not cute / 1 = cute (JAVA / 자바) (0) 2022.02.15 [백준/BOJ] 1236번 : 성지키기 (JAVA / 자바) (0) 2022.02.14 [백준/BOJ] 1193번 : 분수찾기 (JAVA / 자바) (1) 2022.02.14 [백준/BOJ] 1157번 : 단어 공부 (JAVA / 자바) (0) 2022.02.14