중요 지식
이분탐색 - 문제 특성상 1/4씩 탐색 범위를 줄일 수 있는데 이 점은 탐색범위를 1/2씩 줄이는 이분탐색과 비슷하다
코드
#include <iostream>
#include <cmath>
using namespace std;
int main(){
int N, r, c;
int start = 0, mid, end;
int row = 0, col = 0, rMid, cMid;
cin >> N >> r >> c;
for(;N >= 1; N--){
end = (int)(pow(2, N-1) * pow(2, N-1));
mid = (int)pow(2, N-1);
rMid = row + mid;
cMid = col + mid;
if(r < rMid && c < cMid){
start += end * 0;
}else if(r < rMid && c >= cMid){
start += end * 1;
col += mid;
}else if(r >= rMid && c < cMid){
start += end * 2;
row += mid;
}else if(r >= rMid && c >= cMid){
start += end * 3;
row += mid;
col += mid;
}
}
cout << start;
return 0;
}
풀이
이분탐색만 알면 쉽게 풀 수 있는 문제이다
중요한 점
1 Z모양으로 4칸을 탐색했기 때문에 방문 순서의 시작을 쉽게 알 수 있다
0번째 칸 = (탐색할 배열의 크기의 0/4)
1번째 칸 = (탐색할 배열의 크기의 1/4)
2번째 칸 = (탐색할 배열의 크기의 2/4)
3번째 칸 = (탐색할 배열의 크기의 3/4)
2 이분탐색과 비슷하지만 행과 열을 따로 처리해줘야 한다
2차원 배열인 행렬로 탐색하기 때문에 탐색 범위를 반으로 나눌 때 행은 행의 반, 열은 열의 반으로 따로 처리해야한다
'프로그래밍 문제집 > 백준' 카테고리의 다른 글
1389번: 케빈 베이컨의 6단계 법칙 (0) | 2022.02.09 |
---|---|
1107번-리모컨 (0) | 2022.02.07 |
1012번-유기농 배추 (0) | 2022.02.02 |
1260번-DFS와 BFS (0) | 2022.01.29 |
1003번-피보나치 함수 (0) | 2022.01.26 |