[알고리즘] 백준 1018

채상엽·2022년 5월 10일
0

Algorithm

목록 보기
2/13

layout: post
title: "백준 1018 체스판 다시 칠하기"
date: 2022-02-04T00:00:00-00:00
author: sangyeop
categories: Algorithm


백준 1018 체스판 다시 칠하기


https://www.acmicpc.net/problem/1018

실패

  • 문제가 무슨의미인지 이해하지 못했음
    • 크기가 얼마던지 간에 8x8로 잘라서 차례로 전부 한 바퀴를 돌면서 각 경우에 바꿔야하는 색깔 수의 최소값을 찾는다.

성공

  • Boolean을 이용하여 'W'일 경우 true, 'B' 일 경우 false로 이차원배열에 저장
  • 8x8로 자르기 때문에 row-7, column-7과 row+8, column+8의 값이 같아야한다.
    • 만약 다르다면 count의 값을 하나씩 증가시키고, 해당 자리의 색을 바꾼다.
  • 최소 count 값에서는 'W'와, 'B'를 바꾸는 경우를 구분해서 최소값을 찾는다.
  • 8x8 = 64와 위에서 정해진 count 중 최소 값을 비교해서 최종 답을 출력한다.
import java.util.Scanner;

public class Main {
    static boolean[][] temp;
    static int min = 64;

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int row = scanner.nextInt();
        int column = scanner.nextInt();

        temp = new boolean[row][column];

        for (int i = 0; i < row; i++) {
            String s = scanner.next();
            for (int j = 0; j < column; j++) {
                if(s.charAt(j) == 'W')
                    temp[i][j] = true;
                else
                    temp[i][j] = false;
            }
        }

        for (int i = 0; i < row - 7; i++) {
            for (int j = 0; j < column - 7; j++) {
                search(i, j);
            }
        }
        System.out.println(min);
        scanner.close();
    }

    private static void search(int x, int y) {
        int count = 0;

        boolean firstBoolean = temp[x][y];

        for (int i = x; i < x + 8; i++) {
            for (int j = y; j < y + 8; j++) {
                if (temp[i][j] != firstBoolean) {
                    count++;
                }
                firstBoolean = !firstBoolean;
            }
            firstBoolean = !firstBoolean;
        }

        count = Math.min(count, 64 - count);
        min = Math.min(min, count);
    }
}



profile
프로게이머 연습생 출신 주니어 서버 개발자 채상엽입니다.

0개의 댓글

관련 채용 정보