[백준-Java] 브루트포스 4,5번 & 결산

RedPanda·2022년 2월 3일
0

[알고리즘] Java

목록 보기
2/16

한 달 넘게 공부를 멈췄다. 이유는 개인 프로젝트를 엎어야 했기 때문이다.

한 두 달 혼자 열심히 만들던 프로젝트를 한번에 엎는 일은 그렇게 쉬운 일이 아니었다.
그렇게 한 달을 쉬고... 다시 알고리즘 공부를 시작한다.

여유가 있으면 프로젝트를 다시 작업할 생각이지만, swing이 아닌 JS로 처음부터 작업할 생각이다.

1018번) 체스판 다시 칠하기

생각하는 부분 자체가 너무 어려웠다.

우선, boolean 배열을 선언해서 입력된 체스판을 만들었다.

곰곰이 생각해보다가 시작하는 부분에 따라 체스판의 색깔이 결정된다는 것을 알았다.
그래서 8X8 이상의 크기를 입력받았을 때의 경우를 생각해 보았다.

그림은 10X10 체스판의 일부분이다. 시작하는 부분은 회색으로 칠해진 부분 안에 있어야 한다.
그렇다면 이 체스판의 경우의 수는 (N-7)*(M-7)일 것이다.

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


public class Main {
    static boolean[][] board;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] size = (br.readLine()).split(" ");
        int N = Integer.parseInt(size[0]);
        int M = Integer.parseInt(size[1]);
        board = new boolean[N][M];
        for(int i = 0; i < N; i++){
            String input = br.readLine();
            for(int j = 0; j < M; j++){
                if(input.charAt(j) == 'W') board[i][j] = true;
                else board[i][j] = false;
            } // 검은색이면 false 하얀색이면 true
        }
        int min = N*M; // 99999를 넣어도 상관없음. 최솟값에 영향을 받지 않을 값
        int min_N = N-7;
        int min_M = M-7;
        for(int i = 0; i < min_N; i++){
            for(int j = 0; j < min_M; j++){
                int cut = func(i, j);
                if(32 < cut) cut = 64 - cut; // 다시 칠해질 갯수가 32를 넘어가면 반대로 칠하는게 이득
                if(cut < min) min = cut;
            }
        }
        System.out.println(min);
    }
    public static int func(int n, int m){
        int result = 0;
        boolean fst = board[0][0];
        for(int i = n; i < n+8; i++){
            for(int j = m; j < m+8; j++){
                if(board[i][j] != fst) result++;
                fst = !fst;
            }
            fst = !fst;
        }
        return result;
    }
}

1436번) 영화감독 숌

나는 이런 종류의 문제를 싫어한다.
솔직히 문제를 이해하는 데는 오래 걸리지 않았다.

예를 들어, 7번째는 6666이 아니라 6660이 되어 6669가 될때까지 앞자리가 바뀌지 않는다는 것이 이 문제의 트릭이다.

이 문제가 "브루트포스" 문제라는 것을 알았어야 했다.
답은 666부터 입력받은 N개가 count될때까지 하나하나 대입해보는 것이었다.

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int N = scan.nextInt();
        int end = 666;
        int count = 0;
        while(true){
            if(Integer.toString(end).contains("666")) count++;
            if(count == N) break;
            end++;
        }
        System.out.println(end);
    }
}

체스판 문제와 이 문제 모두 생각을 너무 많이 했다.
'아무리 생각해도 이렇게하면 반복을 너무 많이 할 것 같은데...'라는 생각이 문제 풀이 속도를 느리게 한다.

많이많이 풀어서 편견을 없애는게 중요할 것 같다.

profile
끄적끄적 코딩일기

0개의 댓글