본문 바로가기
ALGORITHM/백준

[BOJ/PYTHON] 1074. Z

by 뭉망뭉 2023. 8. 17.

백준 문제 링크: https://www.acmicpc.net/problem/1074

문제 요약

배열을 Z모양(왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로)으로 탐색할 때, r행 c열을 몇 번째로 방문했는지

핵심 아이디어

재귀를 쓰면 되는데, 큰 거부터 구획으로 돌고 작은 거로 재귀로 넘어와야 한다.

이때 탐색 횟수를 더해주는 식으로 모든 칸을 일일이 다 재귀를 돌면 메모리 초과가 나온다. 사분면을 나눠 몇 사분면인지 체크 후 해당 사분면으로 들어가서 다시 나누면 된다.

풀이

# silver1-1074. Z

import sys
sys.setrecursionlimit(10**6)
input = sys.stdin.readline

n, r, c = map(int, input().split())
visit_count = 0 # 방문 횟수

def visit_graph(y, x, num): # num: 제곱 적용된 배열 칸 개수. 
    global visit_count
    next_num = (num // 2) ** 2 
    if num == 1: return visit_count

    if x < num // 2 and y < num // 2: 
        return visit_graph(y, x, num // 2)
    if x >= num // 2 and y < num // 2: 
        visit_count += next_num
        return visit_graph(y, x - num // 2, num // 2)
    if x < num // 2 and y >= num // 2: 
        visit_count += next_num * 2
        return visit_graph(y - num // 2, x, num // 2)
    if x >= num // 2 and y >= num // 2: 
        visit_count += next_num * 3
        return visit_graph(y - num // 2, x - num // 2, num // 2)

print(visit_graph(r, c, 2**n))

Trouble Shooting

메모리 초과 코드

# silver1-1074. Z

import sys
sys.setrecursionlimit(10**6)
input = sys.stdin.readline

n, r, c = map(int, input().split())
array = [[0] * 2**n for _ in range(2**n)]
visit_count = 0 # 방문 횟수

# 큰 거부터 구획으로 돌고 작은 거로 재귀로 넘어와야 함

def visit_graph(y, x, num): # num: 제곱 적용된 배열 칸 개수. 
    global visit_count
    next_num = num // 2
    if num == 2: 
        array[y][x] = visit_count + 0
        array[y][x + 1] = visit_count + 1
        array[y + 1][x] = visit_count + 2
        array[y + 1][x + 1] = visit_count + 3
        visit_count += 4
        return 
    visit_graph(y, x, next_num)
    visit_graph(y, x + next_num, next_num)
    visit_graph(y + next_num, x, next_num)
    visit_graph(y + next_num, x + next_num, next_num)

visit_graph(0, 0, 2**n)
print(array[r][c])

실행 시간

메모리 31256KB, 시간 44ms (python3)

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

[BOJ/PYTHON] 11401. 이항 계수 3  (0) 2023.08.17
[BOJ/PYTHON] 4375. 1  (0) 2023.08.17
[BOJ/PYTHON] 2438. 별 찍기 - 1  (0) 2023.08.17
[BOJ/PYTHON] 1182. 부분수열의 합  (0) 2023.08.17
[BOJ/PYTHON] 10988. 팰린드롬인지 확인하기  (0) 2023.08.17

댓글