"2의 n-1 승씩 사분면을 좁혀나가면 풀릴것 같은데.. " 하다가 30분째 안풀려서 다른 분들의 풀이 포스팅을 읽고 방법을 이해할 수 있었다.
재귀를 이용해서 사분면을 좁혀나가는데,
사분면의 한 변 길이를 이용해서 사분면이 포함하는 칸의 개수를 센다.
그래서 1, 2, 3, 4 사분면마다 더해주는 숫자가 다르다.
다시 풀어볼 문제다.
#include <bits/stdc++.h>
using namespace std;
int N, r, c, answer;
void rec(int n, int row, int col){
if(n == 0) return;
int len = pow(2, n-1); // 사분면 한 변의 길이
int square_cnt = len * len; // 사분면 하나가 포함하는 칸 수
if(row / len == 0 && col / len == 0){ // 1사분면
rec(n-1, row % len, col % len);
}
else if(row / len == 0 && col / len == 1){ // 2사분면
answer += square_cnt;
rec(n-1, row % len, col % len);
}
else if(row / len == 1 && col / len == 0){ // 3사분면
answer += square_cnt * 2;
rec(n-1, row % len, col % len);
}
else if(row / len == 1 && col / len == 1){ // 4사분면
answer += square_cnt * 3;
rec(n-1, row % len, col % len);
}
}
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> r >> c;
rec(N, r, c);
cout << answer;
return 0;
}
728x90
'알고리즘 > 백준' 카테고리의 다른 글
절댓값 힙 백준 11286번 c++ (0) | 2022.02.24 |
---|---|
이중 우선순위 큐 백준 7662번 c++ (0) | 2022.02.24 |
경로 찾기 백준 11403번 c++ (0) | 2022.02.23 |
다리 놓기 백준 1010번 c++ (0) | 2022.02.23 |
셀프 넘버 백준 4673 c++ (0) | 2022.02.22 |