티스토리 뷰

728x90

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의 형태로 존재하는 배열을 Z모양으로 탐색하려 한다.

이 때, r행 c열을 몇 번째로 탐색하는지 찾는 문제이다.

 


  • 풀이 :

Z모양으로 탐색하는 것을 재귀로 구현하였다. 

왼쪽 위, 오른쪽 위, 왼쪽 아래, 오른쪽 아래의 순으로 재귀를 호출하여 각 원소에 인덱스를 삽입하게 된다. 

r행 c열을 만난다면 그 때의 ans값을 출력한다.

 

 

 


  • 소스코드 : 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import sys
input = sys.stdin.readline
ans = 0
 
def recursion(x,y,leng):
    global ans
    if x == r and y == c:
        print(ans)
        exit()
 
    if leng == 1:
        ans += 1
        return
 
    if not (x <= r < x + leng and y <= c < y + leng):
        ans += leng*leng
        return
 
    recursion(x,y,leng//2)
    recursion(x,y + leng // 2,leng // 2 )
    recursion(x + leng// 2 ,y, leng//2)
    recursion(x + leng//2 , y + leng //2 , leng//2)
 
 
if __name__ == '__main__':
    N,r,c = map(int,input().split())
    leng = 2**N
    recursion(0,0,leng)
cs
320x100
댓글
© 2022 WonSeok, All rights reserved