99클럽 코테 스터디 11일차 TIL + 오늘의 학습 키워드

윤휘영·2025년 2월 3일
0

1. 오늘의 학습 키워드

백준 1018-체스판 다시 칠하기(브루트 포스)

2. 공부한 내용 본인의 언어로 정리하기

이중 반복문 사용하여 이차원 배열에서 부분 이차원 배열 추출

static char[][] extract(char[][] map, int rs, int cs){
		int n = map.length;
        char[][] ret = new char[n][n];
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
                ret[i][j] = map[rs + i][cs + j];
            }
        }
        return ret;
    }

3. 오늘의 회고

3.1 어떤 문제가 있었고, 나는 어떤 시도를 했는지

8x8 크기의 부분 체스판을 추출하고, 그 체스판에서 색깔을 바꾸는 작업을 처음에는 다음과 같은 코드로 수행했습니다.

static void copy(char[][] src, char[][] dest){
        int n = src.length, m = src[0].length;
        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                dest[i][j] = src[i][j];
            }
        }
    }

    static int count(char[][] a){
        int cnt = 0;
        char[][] arr = new char[8][8];
        copy(a, arr);
        for(int i = 0; i < 7; i++){
            for(int j = 0; j < 7; j++){
                if(arr[i][j] == 'W'){
                    if(arr[i+1][j] == 'W'){
                        arr[i+1][j] = 'B';
                        cnt++;
                    }
                    if(arr[i][j+1] == 'W'){
                        arr[i][j+1] = 'B';
                        cnt++;
                    }
                }
                else{
                    if(arr[i+1][j] == 'B'){
                        arr[i+1][j] = 'W';
                        cnt++;
                    }
                    if(arr[i][j+1] == 'B'){
                        arr[i][j+1] = 'W';
                        cnt++;
                    }
                }
            }
        }
        copy(a, arr);
        return cnt;
    }

임시 배열을 만들고, 실제로 배열의 색깔을 바꿔가면서 카운트를 했습니다. 그러나 이 코드는 예제 4번에서 오답을 냈습니다. 2차원 배열의 맨 마지막 원소가 연산에서 제외되기 때문이었습니다.

3.2 어떻게 해결했는지

그냥 체스판을 하드코딩해서 해결했습니다.

static char[][] board1 = {
            {'W','B','W','B','W','B','W','B'},
            {'B','W','B','W','B','W','B','W'},
            {'W','B','W','B','W','B','W','B'},
            {'B','W','B','W','B','W','B','W'},
            {'W','B','W','B','W','B','W','B'},
            {'B','W','B','W','B','W','B','W'},
            {'W','B','W','B','W','B','W','B'},
            {'B','W','B','W','B','W','B','W'}
    };

    static char[][] board2 = {
            {'B','W','B','W','B','W','B','W'},
            {'W','B','W','B','W','B','W','B'},
            {'B','W','B','W','B','W','B','W'},
            {'W','B','W','B','W','B','W','B'},
            {'B','W','B','W','B','W','B','W'},
            {'W','B','W','B','W','B','W','B'},
            {'B','W','B','W','B','W','B','W'},
            {'W','B','W','B','W','B','W','B'}
    };

    static int count(char[][] a){
        int c1 = 0, c2 = 0;
        for(int i = 0; i < 8; i++){
            for(int j = 0; j < 8; j++){
                if(a[i][j] != board1[i][j])c1++;
                if(a[i][j] != board2[i][j])c2++;
            }
        }
        return Math.min(c1, c2);
    }

W로 시작하는 체스판과 B로 시작하는 체스판을 하드코딩하고, 각각을 부분배열과 비교해서 더 작은 값을 리턴했습니다.

3.3 무엇을 새롭게 알았는지

역시 패턴을 비교하는 문제에서는 하드코딩으로 무식하게 푸는 것이 좋습니다(대표적으로 테트로미노 문제).

3.4 내일 학습할 것은 무엇인지

내일 출제될 문제를 풀고, 그리디 문제를 풀 예정입니다.

0개의 댓글