https://www.acmicpc.net/problem/1074
1074번: Z
한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. N > 1인 경우, 배열을
www.acmicpc.net
크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 하는데, 예를 들어 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양으로 탐색하는 것이라고 한다.
이게 n이 3일때의 방문 순서도이다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int main() {
int n;
int r, c;
vector< long long > range;
cin >> n >> r >> c;
int a = pow(2, n);
int b = 0;
int d = pow(2, n);
int e = 0;
range.push_back(0);
range.push_back(pow(2, 2*n)-1);
while (n>0) {
long long x = range[1] - range[0] + 1;
if (r >= (a+b)/2 && c >= (d+e)/2) {
range[0] = range[0] + 3 * x / 4;
b = (a + b) / 2;
e = (d+e) / 2;
}
else if (r >= (a + b) / 2 && c < (d + e) / 2) {
range[0] = range[0] + 2 * x / 4;
range[1] = range[0] + x / 4 - 1;
b = (a+b) / 2;
d = (d+e) / 2;
}
else if (r < (a + b) / 2 && c >= (d + e) / 2) {
range[0] = range[0] + x / 4;
range[1] = range[0] + x / 4 - 1;
a = (a + b) / 2;
e = (d + e) / 2;
}
else {
range[1] = range[0] + x / 4 - 1;
a = (a + b) / 2;
d = (d + e) / 2;
}
n--;
}
cout << range[0];
}
우선 본인은 숫자의 범위를 정해 놓고, n을 줄여가며 사분면에 따라서 수의 위치를 분류하는 방법을 사용했다. r,c의 범위에 따라서 사분면을 정하고, 그 사분면의 숫자들을 범위를 통해 다시 저장해 주는 방법을 사용했다.
'백준' 카테고리의 다른 글
백준 1052번 - 물병 (0) | 2024.01.19 |
---|---|
백준 1291번 - 이면수와 임현수 (0) | 2023.07.24 |
백준 1002번 - 터렛 (0) | 2023.07.23 |
백준 1051번 - 숫자 정사각형 (0) | 2023.07.21 |
백준 2108번 - 통계학 (0) | 2023.07.21 |