문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/68936

제한 사항

입출력 예


풀이
import java.util.Arrays;
class Solution {
int[] answer = new int[2];
public int[] solution(int[][] arr) {
int[] one = Arrays.stream(arr)
.flatMapToInt(k -> Arrays.stream(k))
.distinct().toArray();
if (one.length == 1) answer[one[0]]++;
else doQuad(arr);
return answer;
}
public void doQuad(int[][] arr) {
final int aHalfLength = arr.length / 2;
if (arr[0].length > 1) {
int[][][] quadArrs = new int[4][aHalfLength][aHalfLength];
int i = 0;
int j = 0;
for (int y = 0; y < aHalfLength; y++) {
j = 0;
for (int x = 0; x < aHalfLength; x++) {
quadArrs[0][i][j] = arr[y][x];
quadArrs[2][i][j] = arr[y + aHalfLength][x];
j++;
}
i++;
}
i = 0;
for (int y = aHalfLength; y < arr.length; y++) {
j = 0;
for (int x = aHalfLength; x < arr.length; x++) {
quadArrs[1][i][j] = arr[y - aHalfLength][x];
quadArrs[3][i][j] = arr[y][x];
j++;
}
i++;
}
for (int[][] quadArr : quadArrs) {
int[] num = Arrays.stream(quadArr)
.flatMapToInt(k -> Arrays.stream(k))
.distinct().toArray();
if (num.length == 1) answer[num[0]]++;
else doQuad(quadArr);
}
}
else {
for (int[] a : arr)
for (int i : a) answer[i]++;
}
}
}
후기
문제를 보자마자 재귀함수를 써야겠다고 생각했다. 어떻게 답은 맞았긴 했는데 이게 최선의 방식인지는 의문이다... 배열도 3차원 배열을 처음 썼는데 다른 사람들은 3차원까지는 안 쓴 것 같다. 조금 더 생각해보자.
그리고 처음에 모든 공간이 0 또는 1로 채워져 있는 경우를 조심해야 한다. 이것 때문에 10번 테스트만 실패했었다.
'코딩테스트 (프로그래머스) > Java' 카테고리의 다른 글
| [프로그래머스][JAVA][Lv.1] 핸드폰 번호 가리기 (0) | 2023.07.30 |
|---|---|
| [프로그래머스][JAVA][Lv. 2] JadenCase 문자열 만들기 (0) | 2023.07.26 |
| [프로그래머스][JAVA][Lv. 1] 폰켓몬 (0) | 2023.07.24 |
| [프로그래머스][JAVA][Lv. 1] 소수 찾기 (0) | 2023.07.24 |
| [프로그래머스][JAVA][Lv. 1] 행렬의 덧셈 (0) | 2023.07.24 |