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이다. 구하는 배열의 크기에 따라 각 박스를 정해서 구하는 것이다.
이것도 어렵다.. 언제 쉬워지냐..
'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 |
댓글