본문 바로가기
알고리즘

백준 s1 1074 Z c++

by kyj0032 2024. 1. 13.

https://www.acmicpc.net/problem/1074

 

1074번: Z

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

www.acmicpc.net

 

풀이

처음에는 cnt를 두고 한 칸씩 이동하면서 r, c를 찾으려고 하였으나 시간초과가 떴다.

생각해보면 전체 board를 4등분하고 찾으려는 위치가 한 곳에 속하면 나머지는 어차피 2^(N-1)의 제곱 크기만큼 차지하므로, 나머지의 순서는 구할 필요가 없다.

 

수도코드

N == 3 일 때를 예시로 작성했다

func(n, r, c)
	if 1번 부분에 속하면 return func(n-1, r, c)
    else if 2번 부분에 속하면 return 4*4 + func (n-1, r, c-4)
    else if 3번 부분에 속하면 return 2*4*4 + func (n-1, r-4, c)
    else if 4번 부분에 속하면 return 3*4*4 + func (n-1, r-4, c-4)

 

코드

/*boj s1 1074 Z*/
#include <iostream>
using namespace std;

int N, R, C;
int cnt = 0;

int dx[4] = {0, 0, 1, 1};
int dy[4] = {0, 1, 0, 1};

int pow(int a, int b) {
    if (b == 0)
        return 1;
    else if (b == 1)
        return a;
    else
        return a * pow(a, b - 1);
}

int func(int n, int r, int c) {
    if (n == 0) return 0;
    int side = pow(2, n);
    int half = side / 2;

    if (r < half && c < half) {
        return func(n - 1, r, c);
    } else if (r < half && c >= half) {
        return half * half + func(n - 1, r, c - half);
    } else if (r >= half && c < half) {
        return 2 * half * half + func(n - 1, r - half, c);
    } else {
        return 3 * half * half + func(n - 1, r - half, c - half);
    }
}

int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> N >> R >> C;

    cout << func(N, R, C) << "\n";
}

'알고리즘' 카테고리의 다른 글

백준 g5 2448 별 찍기 - 11 c++  (0) 2024.01.13
백준 2447 g5 별 찍기 - 10 c++  (0) 2024.01.13
백준 g5 11729 하노이 탑 이동 순서 c++  (0) 2024.01.13
백준 s1 1629 곱셈 c++  (0) 2024.01.13
백준 g1 9328 열쇠 c++  (0) 2024.01.13