문제풀이/DP 36

[JAVA] [DP] Pro 코딩 테스트 공부

문제 https://school.programmers.co.kr/learn/courses/30/lessons/118668?language=java# 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 코드 class Solution { public int solution(int alp, int cop, int[][] problems) { int maxAlp=0; int maxCop=0; // 알고력, 코딩력 최댓값 구하기 for(int[] p:problems){ maxAlp=Math.max(maxAlp, p[0]); maxCop=Math.max(maxCop, ..

문제풀이/DP 2023.08.02

[파이썬] [DP] 백준 15988 1, 2, 3 더하기 3

문제 https://www.acmicpc.net/problem/15988 15988번: 1, 2, 3 더하기 3 각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 1,000,000,009로 나눈 나머지를 출력한다. www.acmicpc.net 코드 t=int(input()) #dp배열을 n의 방법의 수를 저장하는 것으로 사용 dp=[0]*1000001 dp[1]=1 dp[2]=2 dp[3]=4 # 예를 들어 n이 4인경우, dp[1]에서 3을 추가하는 경우, dp[2]에 2를 추가하는 경우, dp[3]에 1을 추가하는 경우만 존재 for i in range(4,1000001): dp[i]=(dp[i-1]+dp[i-2]+dp[i-3])%1000000009 for _ in range(..

문제풀이/DP 2023.04.07

[파이썬] [DP] 백준 11052 카드 구매하기

문제 https://www.acmicpc.net/problem/11052 11052번: 카드 구매하기 첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 1,000) 둘째 줄에는 Pi가 P1부터 PN까지 순서대로 주어진다. (1 ≤ Pi ≤ 10,000) www.acmicpc.net 코드 n=int(input()) array=[0]+list(map(int, input().split())) dp=[0]*(n+1) for i in range(len(array)): for j in range(i+1): dp[i]=max(dp[i],array[j]+dp[i-j]) print(dp[n]) 생각 정리 dp[n]은 n개의 최댓값을 저장하는 배열이다. dp[1] = array[1] dp[2]..

문제풀이/DP 2023.04.05

[파이썬] [DP] 백준 1446 지름길

문제 https://www.acmicpc.net/problem/1446 1446번: 지름길 첫째 줄에 지름길의 개수 N과 고속도로의 길이 D가 주어진다. N은 12 이하인 양의 정수이고, D는 10,000보다 작거나 같은 자연수이다. 다음 N개의 줄에 지름길의 시작 위치, 도착 위치, 지름길의 길이 www.acmicpc.net 코드 import sys input=sys.stdin.readline n,d=map(int, input().split()) graph=[[] for _ in range(d+1)] for _ in range(n): a,b,c=map(int, input().split()) if b

문제풀이/DP 2023.02.28

[파이썬] [DP] 백준 15989 1, 2, 3 더하기 4

문제 https://www.acmicpc.net/problem/15989 15989번: 1, 2, 3 더하기 4 정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 4가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다. 합을 이루고 있는 수의 순서만 다른 것은 같은 것으로 친다. 1+1+1+1 2+1+1 (1+1+2, 1+2+1) 2+2 www.acmicpc.net 코드 import sys input = sys.stdin.readline #1만 사용하여 나타내는 경우는 한가지 이므로 1로 초기화 dp=[1]*10001 #2가 추가되는 경우 for i in range(2,10001): dp[i]+=dp[i-2] #3이 추가되는 경우 for i in range(3,10001): dp[i]+=dp..

문제풀이/DP 2023.02.27

[파이썬] [DP] 백준 23083 꿀벌 승연이

문제 https://www.acmicpc.net/problem/23083 23083번: 꿀벌 승연이 첫째 줄에 \(N\), \(M\)이 공백으로 구분되어 주어진다. 다음 줄에는 구멍 칸의 개수 \(K\)가 주어진다. 이어서 \(K\)개 줄에 구멍 칸의 정보 \(x_i\), \(y_i\)가 공백으로 구분되어 주어진다. 이는 \(i\)번째 www.acmicpc.net 코드 import sys sys.setrecursionlimit(3000000) input=sys.stdin.readline X=1e9+7 n,m=map(int, input().split()) k=int(input()) #맨 마지막 줄 아래서 위로 올라오는 예외 처리를 위해 n+2 graph=[[-1]*(m+1) for _ in range(n+..

문제풀이/DP 2023.02.06

[파이썬] [DP] 백준 27210 신을 모시는 사당

문제 신을 모시는 사당에는 신을 조각한 돌상 N개가 일렬로 놓여 있다. 각 돌상은 왼쪽 또는 오른쪽을 바라보고 서있다. 창영이는 연속한 몇 개의 돌상에 금칠을 하여 궁극의 깨달음을 얻고자 한다. 궁극의 깨달음을 얻기 위해서는 가능한 한 많은 금색 돌상들이 같은 방향을 바라보아야 한다. 방향이 다른 돌상은 깨달음에 치명적이다. 깨달음의 양은 아래와 같이 정의된다. | (왼쪽을 바라보는 금색 돌상의 개수) - (오른쪽을 바라보는 금색 돌상의 개수) | 창영이는 궁극의 깨달음을 얻을 수 있을까? 입력 첫째 줄에 돌상의 개수 N이 주어진다. 둘째 줄에 돌상이 나열된 순서대로, 각 돌상이 바라보고 있는 방향이 주어진다. 입력의 편의상 왼쪽은 1, 오른쪽은 2라고 하자. 출력 최대한 많은 깨달음을 얻기 위해 금을 ..

문제풀이/DP 2023.01.14

[파이썬] [DP] 백준 11049 행렬 곱셈 순서

문제 https://www.acmicpc.net/problem/11049 11049번: 행렬 곱셈 순서 첫째 줄에 입력으로 주어진 행렬을 곱하는데 필요한 곱셈 연산의 최솟값을 출력한다. 정답은 231-1 보다 작거나 같은 자연수이다. 또한, 최악의 순서로 연산해도 연산 횟수가 231-1보다 작거나 같 www.acmicpc.net 코드 import sys INF=sys.maxsize n=int(input()) arr=[] for i in range(n): t1, t2=map(int, input().split()) arr.append((t1,t2)) dp=[[0]*n for _ in range(n)] for i in range(1,n): for j in range(n-i): if i==1: dp[j][j+1..

문제풀이/DP 2022.12.21

[파이썬] [DP] 백준 9184 신나는 함수 실행

문제 https://www.acmicpc.net/problem/9184 9184번: 신나는 함수 실행 입력은 세 정수 a, b, c로 이루어져 있으며, 한 줄에 하나씩 주어진다. 입력의 마지막은 -1 -1 -1로 나타내며, 세 정수가 모두 -1인 경우는 입력의 마지막을 제외하면 없다. www.acmicpc.net 코드 import sys input=sys.stdin.readline #+51 def recur(a,b,c): if dp[a][b][c]!=-1: return dp[a][b][c] if a71: dp[a][b][c]=recur(71,71,71) elif a

문제풀이/DP 2022.04.24

[파이썬] [DP] 백준 2293 동전 1

문제 https://www.acmicpc.net/problem/2293 2293번: 동전 1 첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. www.acmicpc.net 코드 import sys input=sys.stdin.readline n,k=map(int, input().split()) dp=[0]*(k+1) c=[] for _ in range(n): c.append(int(input())) dp[0]=1 for i in c: for j in range(1,k+1): if j-i>=0: dp[j]+=dp[j-i] print(dp[k]) 생각 정리 dp[0..

문제풀이/DP 2022.04.07