본문 바로가기
Algorithm/백준

1074. Z (C++)

by IT learning 2021. 4. 21.
728x90

Z

시간 제한메모리 제한제출정답맞은 사람정답 비율

0.5 초 (추가 시간 없음)

512 MB

29008

9427

7002

36.800%

문제

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

만약, N > 1이 라서 왼쪽 위에 있는 칸이 하나가 아니라면, 배열을 크기가 2N-1 × 2N-1로 4등분 한 후에 재귀적으로 순서대로 방문한다.

다음 예는 22 × 22 크기의 배열을 방문한 순서이다.

N이 주어졌을 때, r행 c열을 몇 번째로 방문하는지 출력하는 프로그램을 작성하시오.

다음은 N=3일 때의 예이다.

입력

첫째 줄에 정수 N, r, c가 주어진다.

출력

r행 c열을 몇 번째로 방문했는지 출력한다.

 

풀이

 

아이고,, 이건 뭐냐 또,, 라고 생각하며 강의를 보면서 문제를 풀어봤다.

일단 각 박스를 Z 자를 그리며 돌아가는건 알겠다. 그리고 N > 1 때 2N -1 x 2N-1 박스로 4등분해서 재귀적으로 방문한다. 

N=K일때의 결과를 가지고 N=K+1를 구할 수 있다라는 것이다.

#include <bits/stdc++.h>
using namespace std;

int func(int n, int r, int c) {
    if(n == 0) return 0;
    int half = 1<<(n-1); // 2^n-1
    if(r < half && c < half) return func(n-1,r,c); // 1번 박스에 위치할 때
    if(r < half && c >= half) return half * half + func(n-1, r, c-half); // 2번 박스에 위치할 때
    if(r >= half && c < half) return 2*half*half + func(n-1, r-half, c); // 3번 박스에 위치할 때
    return 3*half*half + func(n-1, r-half, c-half);                      // 4번 박스에 위치할 때
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n,r,c;
    cin >> n >> r >> c;
    cout << func(n,r,c);
} 

먼저 함수는 2^n * 2^n 배열에서 (r,c)를 방문하느 순서를 반환하는 함수로 선언하자.

그리고 난 뒤에 n이 0일 경우 그냥 0을 리턴한다는 base condition을 구현해놓고,

half 는 한 변 길이의 절반 ,즉 2^n-1이다. 구하는 배열의 크기에 따라 각 박스를 정해서 구하는 것이다.

 

 

이것도 어렵다.. 언제 쉬워지냐..

728x90

'Algorithm > 백준' 카테고리의 다른 글

7562 나이트의 이동 (C++)  (0) 2021.04.25
2583. 영역 구하기 (C++)  (0) 2021.04.23
11729. 하노이 탑 이동 순서 (C++)  (0) 2021.04.21
1629. 곱셈(C++)  (0) 2021.04.21
2178. 미로 탐색 (C++)  (0) 2021.04.18

댓글

IT_learning's Commit