문제 풀이/[BaekJoon]
[BaekJoon] 1074번 Z (Silver 1) - Python
조랩
2022. 12. 21. 13:03
문제
한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다.
N > 1인 경우, 배열을 크기가 2N-1 × 2N-1로 4등분 한 후에 재귀적으로 순서대로 방문한다.
다음 예는 22 × 22 크기의 배열을 방문한 순서이다.
N이 주어졌을 때, r행 c열을 몇 번째로 방문하는지 출력하는 프로그램을 작성하시오.
다음은 N=3일 때의 예이다.
입출력 예시
입력: 첫째 줄에 정수 N, r, c가 주어진다.
출력: r행 c열을 몇 번째로 방문했는지 출력한다.
<제한사항>
1 ≤ N ≤ 15
0 ≤ r, c < 2N
예제입력1)
2 3 1
예제출력1)
11
예제입력2)
3 7 7
예제출력2)
63
예제입력3)
1 0 0
예제출력3)
0
예제입력4)
4 7 7
예제출력4)
63
예제입력5)
10 511 511
예제출력5)
262143
예제입력6)
10 512 512
예제출력6)
786432
코드
N, r, c = map(int, input().split()) # N, r, c를 입력받는다
result = 0 # 결과를 저장할 변수 선언
# 분할정복
# 주어진 2차원배열은 2의 제곱수의 크기이다.
# 이를 2차원 평면에서 사분면을 나누면, 1, 2, 3, 4사분면이 나온다.
# 각 사분면은 Z모양으로 왼쪽 위가 1사분면, 오른쪽 위가 2사분면, 왼쪽 아래가 3사분면, 오른쪽 아래가 4사분면이다.
# 입력한 칸의 좌표가 어느 사분면에 해당하는지 확인하고, 해당 사분면의 위치에 맞게 r, c값을 업데이트한다.
# 결과값에는 해당 사분면의 대표값(시작하는 값)을 더하여준다.
# 이를 N의 값을 1씩 감소하며 반복하면 마지막에는 4칸짜리 2차원 평면이 나오며, 0, 1, 2, 3의 값을 갖기 때문에 결과값을 얻을 수 있다.
while N > 0: # N이 0보다 클 때 계속 반복
N -= 1 # N을 1 감소
if r < pow(2, N) and c < pow(2, N): # 만약 행(r)이 2^N보다 작고 열(c)이 2^N보다 작으면
pass # 아무것도 안한다.
elif r < pow(2, N) and c >= pow(2, N): # 만약 행(r)이 2^N보다 작고 열(c)이 2^N보다 크거나 같으면
result += pow(pow(2, N), 2) # 결과값에 (2^N)^2만큼 더한다.
c -= pow(2, N) # 열 값을 2^N만큼 감소한다.
elif r >= pow(2, N) and c < pow(2, N): # 만약 행(r)이 2^N보다 작고 열(c)이 2^N보다 작으면
result += pow(pow(2, N), 2) * 2 # 결과값에 ((2^N)^2)*2 만큼 더한다.
r -= pow(2, N) # 행 값을 2^N만큼 감소한다.
else: # 그 외에는
result += pow(pow(2, N), 2) * 3 # 결과값에 ((2^N)^2)*3 만큼 더한다.
r -= pow(2, N) # 행 값을 2^N만큼 감소한다.
c -= pow(2, N) # 행 값을 2^N만큼 감소한다.
print(result) # 결과값을 출력한다.
실행 화면
채점 결과
주석 쓰다가 제출한번 더 해봤는데
글 써놓은거 주석처리 안해서
틀렸어 ㅇ.ㅇ
728x90