앎을 경계하기

Programming/Algorithm 36

백준 #1890 - 점프

action = {right, down} 대신 밟은 번호만큼 움직인다. 각 번호를 밟았을때 right, down 모두 해서 마지막 goal에 닿으면 된다. goal에 닿으면 1을 return 한다. 이 값들을 누적하면 최종적으로 start에서 goal로 갈 수 있는 경로의 수를 알 수 있다. N = int(input()) board = [list(map(int, input().split(' '))) for _ in range(N)] memo = [[0 for _ in range(N)]for _ in range(N)] def dp(board, memo, i, j): if i>=N or j>=N: return 0 if i

백준 #2579 - 계단 오르기

DP로 푸는 문제 DP는 메모이제이션이라고 생각하고 풀면 쉽게 풀 수 있다. 이전스텝에서 현재스텝일때 계단의 가치를 메모이제이션 해두면 연산을 여러번 안해도 되기 때문에 수행시간을 줄일 수 있다. def dp(memo, prev, now, steps): if now == 0: # 시작은 계단으로 안친다. return 0 if steps == 3: # 연속 세 개 밟을 수 없음 return 0 if memo[prev][now]: # 이미 계산한 것이라면 #return memo[prev][now] pass else: if now-2 >= 0: a = dp(memo, now, now-1, steps+1) b = dp(memo, now, now-2, 1) memo[prev][now] = stepVal[now-1..

백준 #10819 - 차이를 최대로

순열을 이용하면 쉽게 풀 수 있는 문제, itertools를 사용하자! 하나의 순열 뽑아서 쭉 식대로 더하는 작업을 순열마다 수행하고 그 중 가장 큰 값을 갖는 것을 출력해주면 된다. from itertools import permutations n = int(input()) arr = permutations(list(map(int, input().split(' ')))) ans = 0 for a in arr: sums = 0 for i in range(n-1): sums+=abs(a[i]-a[i+1]) ans = max(ans, sums) print(ans)

백준 #13913 - 숨바꼭질4

이전 숨바꼭질 문제와 다른 점은 어떻게 이동해야하는지 이동경로를 공백으로 구분해서 출력해야한다. path배열에 next step번째에다가 현재 step을 저장해두고 나중에 역추적해서 출력해주면 된다. from collections import deque N, K = map(int, input().split()) q = deque() q.append(N) time = [0 for _ in range(100001)] path = [0 for _ in range(100001)] ans = [] while q: v = q.popleft() if v == K: print(time[v]) ans.append(str(K)) while v!= N: ans.append(str(path[v])) v = path[v] an..