본문 바로가기

Algorithm(BOJ, Python)/Dynamic Programing56

[백준_9657] 돌게임 3 python 나만 이문제 어려웠나 dp[5]를 상근이가 지는줄 알았다가 간단히 수학으로 해결가능한줄 알았다.. ㅋㅋ 이런날도있는거겠지,, # n 입력 n = int(input()) # dp 설계 dp = [ 0 for _ in range(1001) ] # dp 초기설정 (상근이가 이기는 경우를 1로 설정) dp[1] = 1 dp[3] = 1 dp[4] = 1 # dp 채워넣기 for i in range(5, n+1): if dp[i-1] == 0 or dp[i-3] == 0 or dp[i-4] == 0: dp[i] = 1 # 출력 if dp[n]: print('SK') else: print('CY') 2022. 7. 20.
[백준_1699] 제곱수의 합 python dp[12],, 그를조심해,, # 입력 속도 개선 import sys input = sys.stdin.readline # n 입력 n = int(input()) # dp 설계 dp = [ 0 for _ in range(n+1) ] # 제곲값들 넣어줄 리스트 만들기 s = [i**2 for i in range(1, 317)] # dp 채워넣기 for i in range(1, n+1): # 최솟값 담아줄 리스트 min_list = [] # 1 ~ i 사이까지의 j 값 중 for j in s: # 뺄 제곱수가 i보다 크다면 if j > i: break # 뺄 제곱수가 i보다 작다면 # 최솟값 후보리스트에 올리기 min_list.append(dp[i-j]) # dp에 추가해줄 값 선정 후 + 1 dp[i] = .. 2022. 7. 19.
[백준_14494] 다이나믹이 뭐예요? python 너무 쉬운 문제를 고른 것 같다. 초등학교 길찾기 문제에서 대각선 경로가 하나 추가된 수준 # n, m 입력 n, m = map(int, input().split()) # dp 설계 dp = [ [0] * m for _ in range(n) ] # 초기설정 for i in range(n): dp[i][0] = 1 for i in range(m): dp[0][i] = 1 # dp 채워넣기 for i in range(1, n): for j in range(1, m): dp[i][j] = (dp[i-1][j-1] + dp[i-1][j] + dp[i][j-1]) % 1000000007 # 출력 print(dp[-1][-1] % 1000000007) 이런거 나머지 처리 안해주면 컴퓨터 날라갈수 있으니 조심 ^^ 2022. 7. 19.
[백준_15989] 1,2,3더하기 4 python 이런류의 문제를 여럿 풀어보았지만, 이건 아무리 봐도 규칙을 찾기가 어려웠다. 특히 dp를 풀때는 내가 지금 찾는 dp의 값이, 어디서 오는지를 찾아야하는데, 감이 잡히지 않았다. 결국 구글링을 통해 힌트를 얻었다. 앞으로 이런 문제를 만났을 때는, 어거지로 규칙을 찾아낼 수 있도록 해야할 것 같다. # dp 설계 dp = [ 0 for _ in range(10001) ] # dp 초기설정 dp[1] = 1 dp[2] = 2 dp[3] = 3 # dp 채워넣기 for i in range(4, 10001): dp[i] = dp[i-1] + (dp[i-2] - dp[i-3]) # 보너스점수 if i % 3 == 0: dp[i] += 1 # t 입력 t = int(input()) for _ in range(t.. 2022. 7. 18.
[백준_16194] 카드 구매하기2 python 최솟값들의 후보자들을 조사하는 과정을 구현하는 것이 i-j라고 생각하는데 왜 이렇게 많은 시간을 들였을까 자만하지말자,,, # n 입력 n = int(input()) # p 설계 p = [0] # p 입력 p.extend(list(map(int, input().split()))) # dp 설계 dp = [ 0 for _ in range(n + 1) ] # dp 초기설정 dp[1] = p[1] # dp 채워넣기 for i in range(2, n + 1): # 최솟값 설정 m = 10001 # 최솟값의 후보자들을 조사하면서, for j in range(1, i + 1): # 최솟값을 찾으면, if dp[i-j] + p[j] < m: # 최솟값 갱신 m = dp[i-j] + p[j] # dp 값 추가 dp[.. 2022. 7. 17.
[백준_1965] 상자넣기 python 처음에 헷갈려서 한번 틀렸던 부분이 증가하는 상황에서 전 dp에 단순히 1을 더해주면 끝이아닌가,,? 하면서 더 빠른 코드를 작성할 수 있겠다는 기대감에 부풀었었다. 또한 백준이 제공한 테스트코드도, 위와같은 상황에 적절하게 빠지기 쉬운 테스트 코드를 제공했다 사악하다. 그러나 이전까지의 모든 케이스 중에서 현재보다 작은 상자의 디피 최댓값 + 1을 해줘야 한다. 시간복잡도 측면에서 n = 1000인데, 1초라는것은 n^2의 시간복잡도는 허용한다는 뜻이다. # 입력 속도 개선 import sys input = sys.stdin.readline # n 입력 n = int(input()) # box_list 입력 box_list = list(map(int, input().split())) # dp 설계 dp.. 2022. 7. 15.
[백준_11048] 이동하기 python 대각선, 위, 아래를 모두 생각해 줄 필요는 없다. 모든 사탕은 양수이기 때문이다. 초기 설정만 잘 해주면 쉽게 해결할 수 있다. 근데 이거 그리디 아닌가,,? # n, m 입력 n, m = map(int, input().split()) # grid 설계 grid = [ list(map(int, input().split())) for _ in range(n) ] # dp 설계 dp = [ [0] * m for _ in range(n) ] # 초기 설정 dp[0][0] = grid[0][0] # 가로 줄 초기설정 for i in range(1, m): dp[0][i] = dp[0][i-1] + grid[0][i] # 세로 줄 초기설정 for i in range(1, n): dp[i][0] = dp[i-1].. 2022. 7. 14.
[백준_1904] 01타일 python 이런 문제를 마주할 때마다 귀납적으로 이런 규칙이 있구나하고 발견은 하겠으나 연역적으로 왜 이런 규칙이 나오는지는 잘 모르겠다. 처음에 나눈 값으로 저장 안했다가 맥북 메모리 박살날뻔했다. # dp 설계 dp = [ 0 for _ in range(1000001) ] # dp 초기설정 dp[1] = 1 dp[2] = 2 # dp 채워넣기 for i in range(3, 1000001): dp[i] = (dp[i-2] + dp[i-1]) % 15746 # n 입력 n = int(input()) # 출력 print(dp[n] % 15746) 2022. 7. 13.
[백준_15988] 1, 2, 3 더하기 3 python 처음 문제를 풀었을 때 메모리 초과에 걸렸다. 왜일까 고민하다가 '방법의 수를 1,000,000,009로 나눈 나머지를 출력한다.'에서 힌트를 얻었다. 디피를 채울 때 나머지만 넣어 줘도 상관이 없지 않을까 하는 생각을 했다. # dp 설계 dp = [ 0 for _ in range(1000001) ] # dp 초기설정 dp[1] = 1 dp[2] = 2 dp[3] = 4 # dp 채워넣기 for i in range(4, 1000001): dp[i] = (dp[i-3] + dp[i-2] + dp[i-1]) % 1000000009 # t 입력 t = int(input()) # n 입력 for _ in range(t): n = int(input()) print(dp[n] % 1000000009) 2022. 7. 11.
[백준_15486] 퇴사2 python 퇴사1과 뭐가 다른건지 잘 모르겠다. 수학책 풀고 수학익임책 푼 듯한 느낌,,? # n 입력 n = int(input()) # T, P 설정 T, P = [], [] # t, p 입력 for _ in range(n): t, p = map(int, input().split()) T.append(t) P.append(p) # dp 설정 dp = [ 0 for _ in range(n+1) ] # dp 초기설정 dp[n] = 0 # dp 채우기 for i in range(n-1, -1, -1): if i + T[i] > n: dp[i] = dp[i+1] else: dp[i] = max(dp[i+1], dp[i+T[i]] + P[i]) # 출력 print(dp[0]) 2022. 7. 10.
[백준_11722] 가장 긴 감소하는 부분 수열 python 컴퓨터는 1초에 1억번까지의 연산이 가능하다고 생각하면 된다. 이는 시간복잡도를 계산할 때 유용하게 사용하는 꿀팁이다. 이 문제의 경우 n이 1000개까지 입력되므로, n 제곱까지의 시간복잡도는 허용된다고 생각하면 된다. # n 입력 n = int(input()) # a 입력 a = list(map(int, input().split())) # dp 설계 dp = [ 0 for _ in range(n) ] # dp 초기설정 dp[0] = 1 # 점화식 활용, dp 채워넣기 for i in range(1, n): # 최댓값 설정 M = 0 # i-1 까지 탐색하면서 for j in range(i): # a[i] 보다 크고, 현재 최댓값보다 dp값이 크다면, if a[j] > a[i] and dp[j] > M.. 2022. 7. 9.
[백준_14501] 퇴사 python dp를 거꾸로 뒤집어서 생각할 수도 있어야 한다는 교훈을 얻게 해 준 문제였다. 처음에 갈피를 잘못 잡아 애를 먹다가 구글링을 통해 아이디어를 얻었다. 역시 아직 멀었다. # n 입력 n = int(input()) # t, p 설계 t = [] p = [] # a, b 입력 for _ in range(n): a, b = map(int, input().split()) t.append(a) p.append(b) # dp 설계 dp = [ 0 for _ in range(n+1) ] # dp 채워넣기 for i in range(n-1, -1, -1): if t[i] + i > n: dp[i] = dp[i+1] else: dp[i] = max(dp[i+1], p[i] + dp[i + t[i]]) # 출력 prin.. 2022. 7. 8.
[백준_2193] 이친수 python dp문제를 풀다보면, 마치 고딩때 모의고사에서 규칙 찾듯 쭉 나열하다보면 설마,,? 싶은것들이 나타나는 경우가 있다. 피보나치는 그 중 가장 흔한 케이스이다. 물론 매우 위험한 풀이이다. # dp 설계 dp = [ 0 for _ in range(91) ] # 초기설정 dp[1] = 1 # dp 채워넣기 for i in range(2, 91): dp[i] = dp[i-2] + dp[i-1] # n 입력 n = int(input()) # 출력 print(dp[n]) 2022. 7. 7.
[백준_11057] 오르막 수 python 끝자리 수를 기준으로, 2차원 배열을 통해 해결하면 쉽게 해결된다. # dp설계 dp = [ [1, 0, 0, 0, 0, 0, 0, 0, 0, 0] for _ in range(1001) ] # 초기설정 dp[1] = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] # dp 채워넣기 for i in range(2, 1001): for j in range(1, 10): dp[i][j] = dp[i][j-1] + dp[i-1][j] # n 입력 n = int(input()) # 출력 print(sum(dp[n]) % 10007) 2022. 7. 6.
[백준_9625] BABBA python 예전에 실패했던 문제길래 풀어봤다. 얼마나 멍청했던거냐 과거의 나 # dp 설계 dp = [ [0,0] for _ in range(46) ] # 초기설정 dp[1] = [0,1] dp[2] = [1,1] # dp 채워넣기 for i in range(3, 46): dp[i] = [dp[i-2][0] + dp[i-1][0], dp[i-2][1] + dp[i-1][1]] # n 입력 n = int(input()) # 출력 print(dp[n][0],end=' ') print(dp[n][1]) 2022. 7. 6.
[백준_1932] 정수 삼각형 python 원리만 파악하면다면 매우 쉽게 해결할 수 있는 문제였다. # n입력 n = int(input()) # tri 설계 tri = [] # tri 입력 for _ in range(n): tri.append(list(map(int, input().split()))) # dp 설계 dp = [ [0] * n for _ in range(n) ] # dp 초기설정 dp[0][0] = tri[0][0] j = 1 for i in range(1, n): dp[i][0] = tri[i][0] + dp[i-1][0] dp[i][j] = tri[i][j] + dp[i-1][j-1] j += 1 # dp 채워넣기 for i in range(2, n): for j in range(1, i): dp[i][j] = tri[i][j].. 2022. 7. 6.
[백준_1003] 피보나치함수 python 이상하다 dp가 는거같은 느낌이 든다. 그럴리가 없는데,, 이럴수록 방심하지 말자 난 아직 멀었다. # dp 설계 dp = [ [0,0] for _ in range(41) ] # 초기설정 dp[0] = [1,0] dp[1] = [0,1] # dp 채워넣기 for i in range(2, 41): dp[i] = [dp[i-2][0]+dp[i-1][0], dp[i-2][1]+dp[i-1][1]] # t 입력 t = int(input()) for _ in range(t): # n 입력 n = int(input()) # 출력 print(dp[n][0], end=' ') print(dp[n][1]) 2022. 7. 5.
[백준_9461] 파도반 수열 python 매우 간단한 문제였다. 삼각형의 변의 길이가 정해지는데, 몇 번째 전의 삼각형의 길이를 참조하여 구하는지를 확인한 후 해결하면 간단하게 해결된다. # dp 설계 dp = [ 0 for _ in range(101) ] # 초기설정 dp[1] = 1 dp[2] = 1 dp[3] = 1 dp[4] = 2 dp[5] = 2 # dp 채워넣기 for i in range(6, 101): dp[i] = dp[i-5] + dp[i-1] # t 입력 t = int(input()) for _ in range(t): # n 입력 n = int(input()) # 출력 print(dp[n]) 2022. 7. 5.