2022(112)
-
Dynamic Programming(DP) - RGB거리[1149]
초기 실패 소스코드 import copy N = int(input()) nRGB = [] for i in range(N): RGB = list(map(int, input().split())) nRGB.append(RGB) result = [] for i in range(3): temp = [] idx = i copyRGB = copy.deepcopy(nRGB) sumResult = copyRGB[0][i] for RGB in copyRGB[1:]: RGB[idx] = 1000 temp.append(min(RGB)) sumResult += min(RGB) idx = RGB.index(min(RGB)) result.append(sumResult) print(min(result)) 앞의 색과 겹치지 않는 나머..
2022.04.06 -
Dynamic Programming(DP) - 2×n 타일링[11726]
n = int(input()) dp = [0, 1, 2] if n >= 3: for i in range(3,n+1): next = dp[i-1] + dp[i-2] dp.append(next) print(dp[n] % 10007) 이번 문제의 규칙을 찾다보면 피보나치 수열을 따른다는 것을 알 수 있다. 이것만 찾으면 큰 무리 없이 구할 수 있는 문제다. n = 2 n = 3 n = 4 n = 5 n = 6
2022.04.05 -
Dynamic Programming(DP) - 1, 2, 3 더하기[9096]
m = int(input()) result = [] for _ in range(m): n = int(input()) dp = [0, 1, 2, 4] if n >= 4: for i in range(4, n+1): nextDP = dp[i-1] + dp[i-2] + dp[i-3] dp.append(nextDP) result.append(dp[n]) for i in result: print(i) Idea 규칙을 찾는 것이 Point 1, 2, 3 만으로 연산을 하여 해당 숫자를 만들 수 있는 경우의 수를 구해야했기 때문에 아래처럼 규칙이 나타났다. A(n) = A(n-1) + A(n-2) + A(n-3) A(1) A(2) A(3) A(4) A(5) A(6) 1 1+1 1+1+1 (A(2)+ 1) 1+1+1+1..
2022.04.04 -
Dynamic Programming(DP) - 1로 만들기[1463]
조건 X가 3으로 나누어 떨어지면, 3으로 나눈다. X가 2로 나누어 떨어지면, 2로 나눈다. 1을 뺀다. Idea DP (Bottom-Up 방식) : 결과 저장용 리스트인 DP 테이블을 통해 1부터 N까지 순차적으로 1을 만들기 위한 최소 연산 횟수를 저장 # 여기서 만든 로직은 제일 작은 수인 1부터 순차적으로 최소 연산 횟수로 1을 만드는 방법을 저장하면서 N까지 도달하는 것 N = int(input()) dp = [0] * (N+1) # 1은 아무런 연산을 하지 않아도 되므로, 2부터 시작 for i in range(2, N+1): # +1 = 일단 -1 연산을 했을때의 경우를 카운팅한 것 dp[i] = dp[i-1]+1 # -1 연산을 한 경우와 3 으로 나누는 경우 중에서 횟수가 더 적은 것을..
2022.04.03 -
14501번 - 퇴사*
동적계획법 (DP : Dynamic Programming) 큰 문제를 작은 문제로 나눠서 푸는 알고리즘 수행시간의 비약적 향상이 핵심으로 '메모이제이션'이라는 기법을 사용해 이미 계산된 결과는 별도의 메모리에 저장하여 필요한 경우 다시 계산하지 않고 다시 꺼내 사용하는 방식 Top-Down 방식 : 메모이제이션을 통한 재귀함수를 사용한 방식 Bottom-Up 방식 : 결과 저장용 리스트인 dp 테이블을 통해 반복문으로 문제를 해결 N = int(input()) T = [] P = [] dp = [] for _ in range(N): t, p = map(int, input().split()) T.append(t) P.append(p) dp.append(p) dp.append(0) for i in range..
2022.04.02 -
13458번 - 시험 감독
import math N = int(input()) A = input().split(' ') B, C = map(int, input().split()) cnt = 0 for i in A: i = int(i) - B cnt += 1 if i > 0: cnt += math.ceil(int(i) / C) print(cnt) N = 시험 장소의 수 A = 각 시험장에 있는 학생의 수 B = 감독관이 감독할 수 있는 최대 학생의 수 C = 부감독관이 감독할 수 있는 최대 학생의 수 문제 Key Point 시험 장소에는 1명의 감독관이 무조건 존재해야한다. (2명 이상의 감독관이 들어갈수는 없음) 따라서 감독관이 감독 가능한 학생의 수가 초과되면 나머지 학생들은 부감독관이 감독
2022.04.01