1. 문제
https://www.acmicpc.net/problem/1074
1074번: Z
한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. N > 1인 경우, 배열을
www.acmicpc.net
2. 풀이
import sys
input = sys.stdin.readline
n, r, c = map(int, input().split())
baseNum = 0
rStrIdx = 0
rEndIdx = (2 ** n) - 1
cStrIdx = 0
cEndIdx = (2 ** n) - 1
while True:
if n == 1:
break
if rStrIdx <= r and r < rStrIdx + 2 ** (n - 1):
rEndIdx -= (2 ** (n - 1))
if cStrIdx <= c and c < cStrIdx + 2 ** (n - 1):
cEndIdx -= (2 ** (n - 1))
else:
cStrIdx += (2 ** (n - 1))
baseNum += (4 ** (n - 1))
else:
rStrIdx += (2 ** (n - 1))
if cStrIdx <= c and c < cStrIdx + 2 ** (n - 1):
cEndIdx -= (2 ** (n - 1)) - 1
baseNum += (4 ** (n - 1)) * 2
else:
cStrIdx += (2 ** (n - 1))
baseNum += (4 ** (n - 1)) * 3
n -= 1
if rStrIdx != r:
baseNum += 2
if cStrIdx != c:
baseNum += 1
print(baseNum)
3. FeedBack
- 이 문제는 분할 정복 알고리즘을 처음으로 사용했던 문제이다.
분할 정복 알고리즘의 기본 개념이 방대한 문제를 단위별로 해결하는 것이기 때문에 위 문제의 해결도 동일하게 진행하였다.
전체적인 코드의 흐름은 주어지는 2의 제곱 크기의 이차원 배열을 한번 탐색할 때마다 이전 제곱 크기의 -1 제곱 크기로 줄여가며 탐색을 진행하는 방식이다.
다만, 분할 정복 알고리즘을 처음 개발하다보니 맞는 방식으로 코드를 구성했는지 의문은 있다.
혹시 지나가던 개발 고수님이 계시다면 위 코드에 대한 댓글로 의견을 달아주신다면 감사하겠습니다.
'알고리즘 공부 > 백준' 카테고리의 다른 글
(Python)백준 코딩테스트 연습 - 팔(1105) (0) | 2023.06.25 |
---|---|
(Python)백준 코딩테스트 연습 - 행렬(1080) (0) | 2023.06.24 |
(Python)백준 코딩테스트 연습 - 물병(1052) (0) | 2023.06.20 |
(Python)백준 코딩테스트 연습 - -2진수(2089) (0) | 2023.06.15 |
(Python)백준 코딩테스트 연습 - N번째 큰 수(2075) (0) | 2023.06.06 |