알고리즘/BAEKJOON
체스판 다시 칠하기
현대타운301
2024. 3. 22. 22:40
문제 설명
입출력 예시
요약
흰색 또는 검은색을 기준으로 8x8 체스판을 만들 때 최소로 칠해야 하는 타일의 개수 구하기
풀이
접근 방식
1. 검은색 체스판을 만들기 위해 칠해야 하는 타일의 개수
→ paintB() 메소드를 통해 구한다.
2. 흰색 체스판을 만들기 위해 칠해야 하는 타일의 개수
→ paintW() 메소드를 통해 구한다.
3. 둘 중 최솟값 return
코드리뷰
import java.util.*;
class Main {
static List<String> list = new ArrayList<>();
static String[] choices = {"BWBWBWBW", "WBWBWBWB"}; // 검은색 line과 하얀색 line을 담은 배열
public static int paintB(int row, int col) { // 검은색으로 칠할 때 타일의 개수를 구한다.
int result = 0;
for(int i = row; i < row+8; i++) { // i, j 각각 8회 실행
for(int j = col; j < col+8; j++) {
if((i-row) % 2 == 0) { // 체스판 기준 홀수번 째 line의 경우
if(list.get(i).charAt(j) != choices[0].charAt(j-col)) { // 검은색으로 칠해진 line과 비교
result++; // 색이 다른 타일의 경우 result 증가
}
} else { 체스판 기준 짝수번 째 line의 경우
if(list.get(i).charAt(j) != choices[1].charAt(j-col)) { // 하얀색으로 칠해진 line과 비교
result++;
}
}
}
}
return result;
}
public static int paintW(int row, int col) { // 하얀색으로 칠할 때 타일의 개수를 구한다.
int result = 0;
for(int i = row; i < row+8; i++) {
for(int j = col; j < col+8; j++) {
if((i-row) % 2 == 0) { // 체스판 기준 홀수번 째 line의 경우
if(list.get(i).charAt(j) != choices[1].charAt(j-col)) { // 하얀색으로 칠해진 line과 비교
result++;
}
} else { // 체스판 기준 짝수번 째 line의 경우
if(list.get(i).charAt(j) != choices[0].charAt(j-col)) { // 검은색으로 칠해진 line과 비교
result++;
}
}
}
}
return result;
}
public static void main(String[] args) {
List<Integer> answerList = new ArrayList<>();
Scanner sc = new Scanner(System.in);
int N = sc.nextInt(); // row 개수 입력
int M = sc.nextInt(); // col 개수 입력
sc.nextLine();
for(int i = 0; i < N; i++) {
String str = sc.next(); // 각 line 입력
list.add(str);
}
for(int i = 0; i <= N-8; i++) { // 8x8로 만들기 때문에 N-8(포함)까지 증가
for(int j = 0; j <= M-8; j++) {
answerList.add(paintB(i, j));
answerList.add(paintW(i, j));
}
}
System.out.println(Collections.min(answerList)); // 검은색과 하얀색 둘 중 작은 경우 구하기
sc.close();
}
}
* 검은색으로 칠해야 하는 타일의 수를 구하면 하얀색의 경우는 64에서 빼면 나오기 때문에 paintW() 메소드 생략 가능
→ answerList.add(paintW(i, j)) 이 문장을 answerList.add(64 - paintB(i, j))로 대체