| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
Tags
- 그래프탐색
- DP
- Lv2
- 그래프
- 알고리즘
- 완전탐색
- 다익스트라
- Python
- 분할정복
- Summer/Winter Coding(~2018)
- dfs
- Java
- 정렬
- 이코테
- 프로그래멋
- 토마토
- 자바
- 15686
- 1932
- BFS
- 깃허브 프로필
- 월간 코드 챌린지 시즌1
- 프로그래머스
- 백준
- 알고리즘고득점Kit
- 깃허브
- 조합
- GIT
- 정수 삼각형
- 구현
Archives
- Today
- Total
갱스터하우스
[Java] [월간 코드 챌린지 시즌1] Lv2.쿼드압축 후 개수 세기 본문
문제는 어렵지 않았다.
쿼드를 나누고, 해당 쿼드의 모든 숫자가 같은지 판단하고,
같지 않다면 반복하면 됐다.
문제를 풀면서, 하나 깨닫게 된 게 있는데
바로바로
중간값 산출이다!
여태까지는 두 인덱스 사이의 중간값을 구하라고 하면 (끝 값 - 첫 값)/2로 구했는데,
첫 값과 끝값이 정말로 전체 인덱스의 첫 값과 끝 값이 아닌 경우라면, 이런 방법으로 구하면 안됐다.
예시를 들어보자면,
인덱스가 4, 5, 6, 7, 8 일 경우, 중간 인덱스를 구해보자
- 이전 방식 : (8 - 4) / 2 = 2
- 올바른 방식 : (4 + 8) / 2 = 6
정확하게 두 인덱스 사이의 중간 인덱스 값을 구하려면 두 값을 더해서 2로 나누어야 한다
class Solution {
int[][] arr;
int[] answer = new int[2];
public int[] solution(int[][] arr) {
this.arr = arr;
int n = arr.length; // 길이
getQuad(0, n, 0, n);
return answer;
}
void getQuad(int sx, int ex, int sy, int ey){
// 최후, 1*1 크기의 쿼드 도착
if(ex - sx == 1 && ey - ex == 1){
if(arr[sx][sy] == 0) answer[0] += 1;
else answer[1] += 1;
return;
}
int cur_num = arr[sx][sy];
boolean flag = true;
for(int i = sx; i < ex; i++){
for(int j = sy; j < ey; j++){
if(arr[i][j] != cur_num){
flag = false;
break;
}
}
}
if(!flag){
int midX = (sx+ex) / 2;
int midY = (sy+ey) / 2;
getQuad(sx, midX, sy, midY);
getQuad(midX, ex, sy, midY);
getQuad(sx, midX, midY, ey);
getQuad(midX, ex, midY, ey);
}else{
if(arr[sx][sy] == 0){
answer[0] += 1;
}
else{
answer[1] += 1;
}
}
}
}
'코테 문제 > 프로그래머스' 카테고리의 다른 글
| [Java] 프로그래머스 Lv2.비밀 코드 해독 (1) | 2025.08.04 |
|---|---|
| [Java] [Summer/Winter Coding(~2018)] Lv3.기지국 설치 (0) | 2024.11.02 |
| [Java] [월간 코드 챌린지 시즌1] Lv2. 삼각 달팽이 (0) | 2024.11.01 |
| [Java] [PCCP 기출문제] 2번 / 퍼즐 게임 챌린지 (0) | 2024.10.14 |
| [Python] Lv2.최솟값 만들기 (0) | 2022.05.23 |