백준 1074 - Z (Python3)
코드
n, r, c = map(int, input().split())
answer = 0
while n != 0:
n -= 1
# 제 1사분면
if r < (2 ** n) and c < (2 ** n):
# 사실상 없어도 되는 코드
# 이해하기 쉽게 그냥 주석으로 남겨둠
# answer += (2 ** n) * (2 ** n) * 0
continue
# 제 2사분면
elif r < (2 ** n) and c >= (2 ** n):
answer += (2 ** n) * (2 ** n) * 1
c -= (2 ** n)
# 제 3사분면
elif r >= (2 ** n) and c < (2 ** n):
answer += (2 ** n) * (2 ** n) * 2
r -= (2 ** n)
# 제 4사분면
else:
answer += (2 ** n) * (2 ** n) * 3
c -= (2 ** n)
r -= (2 ** n)
print(answer)
문제 해설
위의 1, 2, 3번의 과정을 n의 값이 0이 될 때까지 반복한다.
제 1사분면일 때가 헷갈릴 수도 있다.
이동 횟수의 집계를 (0, 0)부터 시작했으므로 [(0, 0) => 1회]
(r, c)의 좌표가 n = 1이 되었을 때, 제 1사분면에 해당 좌표가 위치해 있는 경우 이를 집계에 포함하면 1회가 중복되어 들어간다고 보면 된다. 따라서 제 1사분면에 위치하게 되면 최종 이동 횟수에 굳이 값을 더 해선 안 된다.
댓글남기기