Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- AWS
- 리액트
- 파이썬
- 전문가를위한파이썬
- 한빛
- 패스트캠퍼스
- React
- 원티드
- 깃
- 스터디
- 개발
- 코드프레소
- 한빛미디어
- pyladies
- 환경변수
- 개발스터디
- codepresso
- cleancode
- Python
- git
- 위코드
- 프리온보딩
- 예리님
- mongodb
- 코테
- env
- flask
- fluentpython
- pyladiesseoul
- 플라스크
Archives
- Today
- Total
개발자가 내팔자
[BOJ] 백준 1074 Z Python 본문
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))
'Algorithms' 카테고리의 다른 글
[Programmers] 자연수 뒤집어 배열로 만들기 Python / Java / JavaScript / C (0) | 2022.08.05 |
---|---|
[BOJ] 백준 1780 종이의 개수 Python (0) | 2022.07.30 |
[Programmers] 완주하지 못한 선수 Python (0) | 2022.06.01 |
[BOJ] 백준 1966 프린터 큐 Python (0) | 2022.05.30 |
[BOJ] 백준 11866 요세푸스 문제 0 Python (0) | 2022.05.30 |
Comments