[백준] Java - 1018번 : 체스판 다시 칠하기

2024. 11. 29. 14:11·Java & Spring/코딩테스트

- 알고리즘 : 브루트 포스

- 전체 코드

import java.io.*;

public class Main {
    public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    public static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

    public static void main(String[] args) throws IOException {

        String[] input = br.readLine().split(" ");
        int N = Integer.parseInt(input[0]);
        int M = Integer.parseInt(input[1]);

        String[] arr = new String[N];
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < N; i++) {
            arr[i] = br.readLine();
        }

        int min = Integer.MAX_VALUE;

        for (int i = 0; i <= M - 8; i++) {
            for (int j = 0; j <= N - 8; j++) {
                sb = new StringBuilder();
                int line = 0;
                while (line < 8) {
                    sb.append(arr[j + line], i, i + 8);
                    line++;
                }
                int count1 = startB(sb);
                int count2 = startW(sb);
                if (min > Math.min(count1, count2)) {
                    min = Math.min(count1, count2);
                }
            }
        }
        System.out.println(min);
    }

    private static int startB(StringBuilder sb) {

        int count1 = 0;
        for (int i = 1; i <= 8; i++) {
            if (i % 2 == 1) {
                for (int j = (i - 1) * 8; j < i * 8; j += 2) {
                    if (sb.charAt(j) != 'B') {
                        count1++;
                    }
                    if (sb.charAt(j + 1) != 'W') {
                        count1++;
                    }
                }
            } else {
                for (int j = (i - 1) * 8; j < i * 8; j += 2) {
                    if (sb.charAt(j) != 'W') {
                        count1++;
                    }
                    if (sb.charAt(j + 1) != 'B') {
                        count1++;
                    }
                }
            }
        }
        return count1;
    }

    private static int startW(StringBuilder sb) {

        int count1 = 0;
        for (int i = 1; i <= 8; i++) {
            if (i % 2 == 1) {
                for (int j = (i - 1) * 8; j < i * 8; j += 2) {
                    if (sb.charAt(j) != 'W') {
                        count1++;
                    }
                    if (sb.charAt(j + 1) != 'B') {
                        count1++;
                    }
                }
            } else {
                for (int j = (i - 1) * 8; j < i * 8; j += 2) {
                    if (sb.charAt(j) != 'B') {
                        count1++;
                    }
                    if (sb.charAt(j + 1) != 'W') {
                        count1++;
                    }
                }
            }
        }
        return count1;
    }
}

 

- 풀이과정

 

1. 8 * 8 체스판 생성하기

위 그림과 같이 M, N - 8까지 진행

  for (int i = 0; i <= M - 8; i++) {
            for (int j = 0; j <= N - 8; j++) {
                sb = new StringBuilder();
                int line = 0;
                while (line < 8) {
                    sb.append(arr[j + line], i, i + 8);
                    line++;
                }

 

 

2. 첫번째 칸이 Black인 경우 & 첫번째 칸이 White인 경우

private static int startB(StringBuilder sb) {

        int count1 = 0;
        for (int i = 1; i <= 8; i++) {
            if (i % 2 == 1) {
                for (int j = (i - 1) * 8; j < i * 8; j += 2) {
                    if (sb.charAt(j) != 'B') {
                        count1++;
                    }
                    if (sb.charAt(j + 1) != 'W') {
                        count1++;
                    }
                }
            } else {
                for (int j = (i - 1) * 8; j < i * 8; j += 2) {
                    if (sb.charAt(j) != 'W') {
                        count1++;
                    }
                    if (sb.charAt(j + 1) != 'B') {
                        count1++;
                    }
                }
            }
        }
        return count1;
    }

 

3. 두 경우 중 변경이 작은 수 반환 & 전체 경우의 수 중 가장 작은지 판단

                if (min > Math.min(count1, count2)) {
                    min = Math.min(count1, count2);
                }

 

 

 

 

 

'Java & Spring > 코딩테스트' 카테고리의 다른 글

[백준][Gold IV] Java - 1043번 : 거짓말  (2) 2025.01.28
[백준] Java - 1929번 : 소수 구하기  (0) 2024.12.10
52일차 - 알고리즘 코드카타(실패)  (2) 2024.10.01
43일차 - 알고리즘 코드카타  (1) 2024.09.12
42일차 - 알고리즘 코드카타  (2) 2024.09.11
'Java & Spring/코딩테스트' 카테고리의 다른 글
  • [백준][Gold IV] Java - 1043번 : 거짓말
  • [백준] Java - 1929번 : 소수 구하기
  • 52일차 - 알고리즘 코드카타(실패)
  • 43일차 - 알고리즘 코드카타
DJ.Kang
DJ.Kang
백엔드 개발 기록 블로그
  • DJ.Kang
    DJ Hello World
    DJ.Kang
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • 이론공부
        • 개념
        • 정보처리기사 필기
        • 정보처리기사 실기 기출
        • 네트워크관리사 2급
        • SQLD
      • 시스템설계
      • Java & Spring N
        • TIL
        • 트러블슈팅
        • 고도화
        • 알고리즘
        • 코딩테스트
        • Java N
        • Spring
        • Thymeleaf
      • 프로젝트
        • coin-trading
        • 트러블슈팅
      • Docker
      • 웹
      • git & github
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    java
    java 에라토스테네스의 체
    자료구조
    java enhance switch
    java 메서드
    데이터 타입
    Java 생성자
    java기초
    java 유클리드 호제법
    java arrays.copyofrnage()
    개발로드맵
    java 제어자
    java super
    프로그래머스 java 기초 트레이닝
    데이터 크기
    프로그래머스 java 기초트레이닝
    java 세수의합
    java two-pointer
    java 멤버
    Java this
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
DJ.Kang
[백준] Java - 1018번 : 체스판 다시 칠하기
상단으로

티스토리툴바