프로그래밍/알고리즘 문제 풀이
[백준 시리즈] 2666번 : 벽장문의 이동 - 골드5 / Python
강민재02
2024. 9. 21. 00:48
728x90
2666번 : 벽장문의 이동
출처 : 백준 / https://www.acmicpc.net/problem/2666
사용 알고리즘 : 브루트 포스
문제 설명
1. 항상 2개의 문이 열려있는 벽장 N개가 있다.
2. 문을 열 벽장의 순서에 따라서 벽장문 이동 횟수의 최솟값을 구하라.
3. 벽장문은 옆 벽장이 비어있어야 이동가능하다.
제한
시간제한 : 1초 / 메모리 제한 : 128 MB
N (3 <=N <=20)
문을 열 벽장의 개수는 최대 20개이다.
문제 풀이
1단계 : 최대 시간복잡도는 얼마인가?
모든 경우의 수를 고려하는 브루트포스로 문제를 해결했을 때, 최악의 경우에도 20*2^20번의 연산만이 수행되기 때문에 브루트포스 알고리즘으로 해결할 수 있다.
2단계 : naive 하게 생각해 보자
현재 더 가까운 쪽의 벽장문을 열더라도 그것이 최선인지는 알 수 없다. 따라서, 주어지는 벽장문마다 열려있는 두 벽장문을 모두 선택해봐야 한다.
정답 코드
n = int(input())
a, b = map(int, input().split())
m = int(input())
arr = [int(input()) for _ in range(m)]
def move(a, b, i):
if i == m:
return 0
return min(move(arr[i], b, i+1)+abs(arr[i]-a), move(a, arr[i], i+1)+abs(arr[i]-b))
ans = move(a, b, 0)
print(ans)
사견
메모이제이션을 사용하여 최적화할 수 있을 것 같다.
728x90