동적프로그래밍 6

[Python | 프로그래머스 | Lv_3] 연속 펄스 부분 수열의 합

😉 아이디어1. _!1 or -1!_로 시작하는 펄스수열이 적용된 리스트 생성2. 리스트 순회 중 최대값 기록 (순회 중인 값을 더해 음수의 값이 나온다면 기록하지 않고 초기화)3. 두 수열에서 최대값을 비교하고 더 큰 값을 반환😉 풀이def solution(sequence): answer = 0 p1 = [] p2 = [] val = 1 for i, s in enumerate(sequence): p1.append(val * s) # 1로 시작하는 시퀀스 p2.append(-val * s) # -1로 시작하는 시퀀스 val = val * -1 p1MaxSum = calculateMaxSum(p1) p2Ma..

알고리즘 2024.09.14

[Python | 프로그래머스 | Lv_2] 땅따먹기

😉 아이디어1. 동적 프로그래밍 처리 문제2. 현 Row의 인덱스를 기준으로 이전 Row와 합산이 가능한 경우의 수 중 최대 산출3. 현재 Row의 값에 반영하고 다음 행 진행😉 풀이def getValue(prevRow, currentValue, blockedIndex): # 이전에 사용한 인덱스 외 모든 경우의 수 비교 maxValue = -1 #print('prevRow', prevRow) for i in range(len(prevRow)): if i == blockedIndex: continue prevValue = prevRow[i] maxValue = max(maxValue, prevValue + currentVa..

알고리즘 2024.07.17

[Python | 프로그래머스 | Lv_2] 2 x n 타일링

😉 아이디어1. 특이케이스 생성에 집중 👉 _!n > 2 이상부터는 특이케이스 없음!_ 2. _!n = 1 or 2!_의 특이케이스로 점화식 생성😉 풀이def solution(n): answer = 0 # n = 1 -> 1 (1) # n = 2 -> 2 (1) # n = 3 -> 3 (0) # n = 4 -> f(3) * 1 + f(2) * 1 + f(1) * 0 # n = 5 -> f(4) * 1 + f(3) * 1 + f(2) * 0 + f(1) * 0 # 패턴: [0, 1, 1, 0, 0, ...] dp = [0, 1, 2, 3] pattern = [0, 1, 1, 0, 1, 0] isZero = True for i in range(4, n + 6): val = (dp[i - 1] + dp[i -..

알고리즘 2024.05.29

[Python | 프로그래머스 | Lv_3] 아방가르드 타일링

😉 아이디어1. _!n이 7미만일 경우!_까지 각 특수한 조합 개수 확인 👉 _![1, 2, 5, 2, 2, 4]!_반복됨2. 3의 배수로 반복되고 있으므로_!f(n + 3) - f(n)!_를 통해 _!f(n)!_의 점화식 계산😉 풀이 def solution(n): dp = [0] * (n + 10) dp[1] = 1 dp[2] = 3 dp[3] = 10 MOD = 1_000_000_007 # n이 6 이하인 경우 저장 for i in range(4, n + 1): if i == 4: dp[i] = dp[i - 1] + dp[i - 2] * 2 + dp[i - 3] * 5 + 2 elif i == 5: ..

알고리즘 2024.05.11