본문 바로가기
Programming Solve/BOJ

BOJ 1074 - Z / C++

by msm1029 2022. 4. 21.
반응형

문제 링크 : https://www.acmicpc.net/problem/1074

 

1074번: Z

한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. N > 1인 경우, 배열을

www.acmicpc.net

 

 

풀이

2^n x 2^n 배열을 직접 그리려하면 시간 제한에 걸려 풀 수 없다.

따라서, 배열을 2^(n-1) x 2^(n-1) x 4로 네 구역으로 나누고 차례대로 Z 모양의 순서로 방문하면 된다.

 

 

 

예를 들어, 배열이 위의 그림과 같이 있을 때 r=2, c=1에 위치한 값을 구하려고 한다.

현재 n=2이므로 2^2 x 2^2 배열이다. 이를 네 구역으로 나누면 1구역(0~3), 2구역(4~7), 3구역(8~11), 4구역(12~15)로

나눌 수 있고 r=2, c=1는 3구역에 위치한다.

 

따라서 1, 2구역은 볼 필요 없이 그 크기만큼 더해버리고 다시 3구역에서 재귀적으로 구역을 나누어 계산하면

좌표가 r=2, c=1에 도달하게 되어 그동안 더했던 값들을 return 하면 된다.

 

호출 순서가 1, 2, 3, 4구역 순서이므로 4구역은 호출되지 않는다.

 

코드

#include <iostream>
#include <cmath>
using namespace std;

int n, r, c;
int ans = 0;

//행(row)는 y와 관련, 열(column)은 x와 관련
void solution(int y, int x, int size) {
    if(y == r && x == c){
        cout << ans;
        return;
    }

    if(r < y + size && r >= y && c < x + size && c >= x){
        solution(y, x, size / 2);
        solution(y, x + size / 2, size / 2);
        solution(y + size / 2, x, size / 2);
        solution(y + size / 2, x + size / 2, size / 2);
    }
    else ans += size*size;
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);

    cin >> n >> r >> c;
    solution(0, 0, pow(2, n));
}
반응형

'Programming Solve > BOJ' 카테고리의 다른 글

BOJ 10464 - XOR / C++  (0) 2022.04.21
BOJ 1107 - 리모컨 / C++  (0) 2022.04.21
BOJ 16928 - 뱀과 사다리 게임 / C++  (0) 2022.04.18
BOJ 18870 - 좌표 압축 / C++  (0) 2022.04.17
BOJ 15829 - Hashing / C++  (0) 2022.04.14