[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);
๐ ํ์ด ์ฝ๋
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;
}
}