yha97 2022. 12. 20. 14:43

날짜 : 2022. 12. 20

사용 언어 : python

 

문제

 

 

코드

import sys

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

i, j = 0, 0  # 기준점
cnt = 0
while True:
    #print(i, j)
    if i == r and j == c: break
    n -= 1
    l = (2 ** n)
    if r >= (i + l):
        # 3, 4사분면
        i += l
        if c >= (j + l):
            # 4사분면
            j += l
            cnt += l * l * 3
        else:
            # 3사분면
            cnt += l * l * 2
            continue
    else:
        # 1, 2사분면
        if c >= (j + l):
            # 1사분면
            j += l
            cnt += l * l * 1
        else:
            # 2사분면
            continue
print(cnt)

 

 

풀이

- 각 사분면을 2의 멱승으로 구한 다음, 이 길이를 기준으로 각 사분면을 나눈다.

- 그리고 각 사분면에 따라 cnt(기준점의 방문순서)를 갱신하고 점차 그 길이를 줄여나가면서 r과 c가 i, j와 일치할 때까지 계속 반복한다.

 

알게된 점

- 맨 처음 반복문 형식으로 하나씩 구하려다가 때려치고 다른 방법을 찾아보았다.

- 사분면을 나눈다는 아이디어를 알고 나니까 막상 구현은 크게 어렵지 않았다.

 

 

 

참고 사이트