4/12 재귀함수2

JK·2023년 4월 13일
0

어제 재귀함수에 대해 공부하다가 아직 많이 부족한거 같아 재귀함수를 활용한 문제를 더 풀어보기로 했습니다
문제를 풀기전에 다시한번 재귀함수에 대해 집고 넘어가자면

함수 안에서 함수 자기자신을 호출하고, 종료 조건을 제대로 잡지 않으면 무한 루프에 빠질수 있습니다
재귀함수의 장점으로는
1. 코드가 간결해집니다.
2. 재귀 호출로 인해 복잡한 작업이 간단한 작은 작업으로 나눠질 수 있습니다
3. 시퀀스 데이터 처럼 순서있는 데이터를 효율적으로 처리할 수 있습니다

그에 반해 단점으로는
1. 작업에 따라서는 재귀 호출의 작동 원리를 이해하기가 어려울 수 있습니다
2. 메모리도 많이 소모하고 속도가 느릴 수 있습니다
3. 에러 발생시 디버깅이 어렵습니다

문제 링크

[Silver I] Z - 1074

성능 요약
메모리: 31256 KB, 시간: 40 ms

분류
분할 정복, 재귀

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

N > 1인 경우, 배열을 크기가 2^N-1 × 2^N-1로 4등분 한 후에 재귀적으로 순서대로 방문한다.
다음 예는 2^2 × 2^2 크기의 배열을 방문한 순서이다.

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

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

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

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

n, r, c = map(int, input().split())

num = 0

while n > 1:
    ran = 2 ** (n - 1)
    if r >= ran:
        if c >= ran:
            num += (4 ** (n - 1)) * 3
            r -= ran
            c -= ran
        else:
            num += (4 ** (n - 1)) * 2
            r -= ran

    else:
        if c >= ran:
            num += (4 ** (n - 1)) * 1
            c -= ran
        else:
            pass

    n -= 1

if r == 0:
    if c == 0:
        print(num)
    else:
        print(num + 1)
else:
    if c == 0:
        print(num + 2)
    else:
        print(num + 3)
profile
^^

0개의 댓글