๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

[Java] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค Lv2 : ์ฟผ๋“œ์••์ถ• ํ›„ ๊ฐœ์ˆ˜ ์„ธ๊ธฐ

๐ŸŒŽ Link : https://school.programmers.co.kr/learn/courses/30/lessons/68936

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr


๐Ÿ’ก ์ ‘๊ทผ ๋ฐฉ๋ฒ•

์ด์ฐจ์› ๋ฐฐ์—ด arr๊ฐ€ ์ฃผ์–ด์ง€๊ณ  ์ฟผ๋“œ ํŠธ๋ฆฌ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์••์ถ•์„ ํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

์ถœ์ฒ˜ : ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์—ฌ๊ธฐ์„œ ํฌ์ธํŠธ๊ฐ€ ์žˆ๋Š”๋ฐ arr์˜ ํ–‰์˜ ๊ฐœ์ˆ˜๋Š” 1 ์ด์ƒ 1024 ์ดํ•˜์ด๋ฉฐ, 2์˜ ๊ฑฐ๋“ญ ์ œ๊ณฑ์ˆ˜ ํ˜•ํƒœ๋ฅผ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ๋ถ€ํ„ฐ n๊ฐœ์˜ ์ˆซ์ž๋ฅผ ํ•ฉ์น  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์•ˆ ๋  ๊ฒฝ์šฐ n /2 ๊ทธ๋‹ค์Œ n/2^2 ์ด๋Ÿฐ ์‹์œผ๋กœ ์ ์  ์ค„์—ฌ์„œ ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•˜๋ฉด ๋œ๋‹ค.

 

๋ฐฑํŠธ๋ ˆํ‚น์„ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ํƒˆ์ถœ ์กฐ๊ฑด์œผ๋กœ๋Š” check๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ํ•ด๋‹น์นธ์ด ์ „๋ถ€ ๊ฐ™์€ ์ˆซ์ž์ธ์ง€ ๊ฒ€์ฆ์„ ํ•ด์ค€๋‹ค.

if (check(row, col, size)) {
    if (array[row][col] == 0) zero++;
    else one++;
    return;
}
private boolean check(int row, int col, int size) {
    int target = array[row][col];

    for (int i = row; i < row + size; i++) {
        for (int j = col; j < col + size; j++) {
            if (target != array[i][j]) return false;
        }
    }

    return true;
}

 

๊ทธ๋‹ค์Œ ์žฌ๊ท€๋กœ ๋Œ๋ ค์•ผ ํ• ๋ถ€๋ถ„์„ ์ƒ๊ฐ์„ ํ•ด์•ผ ํ•˜๋Š”๋ฐ ์œ„์˜ ํฌ์ธํŠธ 2์˜ ๊ฑฐ๋“ญ ์ œ๊ณฑ์ˆ˜ ํ˜•ํƒœ๋ฅผ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— n/2๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋ฉด ๋œ๋‹ค.

์ถœ์ฒ˜ : ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์œ„์˜ ์ˆœ์„œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํƒ์ƒ‰์„ ํ•  ๋•Œ ์ „์ฒด 4 * 4๊ฐ€ ๋˜‘๊ฐ™์€ ์ˆซ์ž์ธ์ง€ ๊ฒ€์ฆ์„ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐ™์€ ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ 2 * 2๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํƒ์ƒ‰์„ ํ•ด์•ผ ํ•œ๋‹ค.

์™ผ์ชฝ ์•„๋ž˜(0, 0), ์˜ค๋ฅธ์ชฝ ์•„๋ž˜(0, 2), ์™ผ์ชฝ ์œ„(2, 0), ์˜ค๋ฅธ์ชฝ ์œ„(2, 2)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‹ค์‹œ ํƒ์ƒ‰์„ ํ•œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ์˜ค๋ฅธ์ชฝ ์œ„(2, 2)๊ฐ€ ๋ชจ๋‘ ๊ฐ™์€ ์ˆ˜์ด๋ฏ€๋กœ ํƒˆ์ถœ์กฐ๊ฑด์„ ์™„์„ฑํ•˜๊ฒŒ ๋ผ์„œ 0์˜ ์ˆซ์ž๋ฅผ ์นด์šดํŒ… ํ•ด์ฃผ๊ณ  ํƒˆ์ถœํ•œ๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ 1 * 1๊นŒ์ง€ ํƒ์ƒ‰์„ ํ•˜๊ณ  ์ ์  2๋ฅผ ๋‚˜๋ˆ„๋ฉด์„œ ์ค„์—ฌ ๋‚˜๊ฐ€๋ฉด ๋œ๋‹ค. 

int sliceSize = size / 2;

backtracking(row, col, sliceSize);
backtracking(row, col + sliceSize, sliceSize);
backtracking(row + sliceSize, col, sliceSize);
backtracking(row + sliceSize, col + sliceSize, sliceSize);

2 * 2 ํƒ์ƒ‰


๐Ÿ— ํ’€์ด ์ฝ”๋“œ

class Solution {
    int zero = 0, one = 0;
    static int[][] array;

    public int[] solution(int[][] arr) {
        array = arr.clone();
        backtracking(0, 0, arr.length);

        return new int[]{zero, one};
    }

    private void backtracking(int row, int col, int size) {
        if (check(row, col, size)) {
            if (array[row][col] == 0) zero++;
            else one++;
            return;
        }

        int sliceSize = size / 2;

        backtracking(row, col, sliceSize);
        backtracking(row, col + sliceSize, sliceSize);
        backtracking(row + sliceSize, col, sliceSize);
        backtracking(row + sliceSize, col + sliceSize, sliceSize);
    }

    private boolean check(int row, int col, int size) {
        int target = array[row][col];

        for (int i = row; i < row + size; i++) {
            for (int j = col; j < col + size; j++) {
                if (target != array[i][j]) return false;
            }
        }

        return true;
    }
}