개발자가 내팔자

[BOJ] 백준 1074 Z Python 본문

Algorithms

[BOJ] 백준 1074 Z Python

야생의 개발자 2022. 7. 29. 01:46

 

https://www.acmicpc.net/problem/1074

 

1074번: Z

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

www.acmicpc.net

 

나는 이 문제가 정말 싫었는데.. 너무 풀기가 귀찮았기 때문이다.

근데 그건 머릿속에 떠오른 풀이가 더러워서인 것 같다.

나의 풀이는 다음과 같다.

import sys

def get_sabun(n, r, c):
    medium = 2 ** (n - 1)
    if r < medium and c < medium:
        return 1
    if r < medium and c >= medium:
        return 2
    if r >= medium and c < medium:
        return 3
    if r >= medium and c >= medium:
        return 4

def solution(n, r, c, start):
    if n == 1:
        if r == 0 and c == 0:
            return start
        elif r == 0 and c == 1:
            return start + 1
        elif r == 1 and c == 0:
            return start + 2
        elif r == 1 and c == 1:
            return start + 3
    sabun = get_sabun(n, r, c)
    medium = 2 ** (n - 1)
    start += ((medium ** 2) * (sabun - 1))
    medium = medium
    if sabun == 2:
        c = c - medium
    elif sabun == 3:
        r = r - medium
    elif sabun == 4:
        r = r - medium
        c = c - medium
    return solution(n - 1, r, c, start)

n, r, c = map(int, sys.stdin.readline().split())
print(solution(n, r, c, 0))

정말 너무 더럽고... 왜 나는 이런 풀이밖에 떠오르지 않는 걸까 생각하면서 조금 슬퍼졌다.

왜냐면 바킹독의 풀이는 나보다 짧고 간결한데, 어떻게 해야 이런 걸 단번에 떠올릴 수 있을까?

조금 더 시간을 들이면 가능해지겠지만, 아직은 아쉬움이 남았다.

언젠가는 나도 이런 코드를 짜고 싶다.

나도 좋은 아이디어가 쏙쏙 떠오르면 좋겠다.

바킹독의 알고리즘 강의는 정말 최고다. 그를 커비하고 싶다.

아래는 그의 풀이

import sys


n, x, y = map(int, sys.stdin.readline().split())

def solution(n, x, y):
    if n == 0:
        return 0
    half = 2 ** (n - 1)
    if x < half and y < half:
        return solution(n - 1, x, y)
    if x < half and y >= half:
        return half * half + solution(n - 1, x, y - half)
    if x >= half and y < half:
        return 2 * half * half + solution(n - 1, x - half, y)
    return 3 * half * half + solution(n - 1, x - half, y - half)

print(solution(n, x, y))

 

Comments