1. 문제 출처 https://www.acmicpc.net/problem/1912 1912번: 연속합 첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다. www.acmicpc.net 2. 풀이 DP방법중 BottomUp 방법을 이용하여 문제를 해결하였다. import sys n = int(sys.stdin.readline()) nums = list(map(int , sys.stdin.readline().split(" "))) dp =nums.copy() for i in range(1, n): dp[i] = max(dp[i-1]+dp[i],dp[i]) print(max(d..
1. 문제 출처 https://www.acmicpc.net/problem/11726 11726번: 2×n 타일링 2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다. www.acmicpc.net 2. 풀이 맨 앞의 사각 형이 "|" 로 시작하거나 "=" 로 시작하는 경우 2개로 생각하면 된다. # 입력 import sys n = int(sys.stdin.readline()) if n
1. 문제 출처 https://www.acmicpc.net/problem/1003 1003번: 피보나치 함수 각 테스트 케이스마다 0이 출력되는 횟수와 1이 출력되는 횟수를 공백으로 구분해서 출력한다. www.acmicpc.net 2. 풀이 Dynamic Programming botton up 방법을 사용하여 입력 받은 값 중 최대값의 0,1의 개수를 구하면 그 밑의 값은 dp배열에 저장되어 있다. 그것을 이용하여 풀면 다음과 같은 코드가 나온다. ## 입력 받는 부분 import sys t = int(sys.stdin.readline()) input_list = [] for i in range(t): input_list.append(int(sys.stdin.readline())) ## 입력받은 값중 최..
1. 문제 출처 https://www.acmicpc.net/problem/1463 1463번: 1로 만들기 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다. www.acmicpc.net 2. 풀이 Dynamic Programming 방법 중 botton up 방법을 사용하여 문제를 해결하였다. # 입력받기 import sys n = int(sys.stdin.readline()) # 미리값을 저장할 배열 dp = [0] * (n+2) # 1~3까지는 바로 출력한다. if n==1: print(0) elif n==2 | n==3: print(1) else: dp[2] = 1 dp[3] = 1 for i in range(4, n+1): # 숫자가 i일 때 # 3가지 방법 중 최소 횟..
1. 문제 https://www.acmicpc.net/problem/2579 2579번: 계단 오르기 계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. 과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점 www.acmicpc.net 2. 해결법 n번째 계단으로 마무리 해야 하므로 각 계단에 도착했을 때 나올 수 있는 경우는 2가지이다. 1. n-2 번째 계단을 들린 후 오는 경우 2. n-3 , n-1번째 계단을 들린 후 오는 경우 두가지중 최대값을 선택하면 된다. 이를 코드로 나타내면 다음과 같다. # dp = 지난 계단의 정수 합을 저장하는 배열 # stairs = 각 계단에 적힌 정수값 dp[i] = (stairs[i]+..
1. 문제 출처 https://www.acmicpc.net/problem/2229 2229번: 조 짜기 알고스팟 캠프에 N(1 ≤ N ≤ 1,000)명의 학생들이 참여하였다. 학생들은 열심히 공부를 하고 있었는데, 어느 날 조별 수업을 진행하기로 하였다. 조별 수업의 목적은 잘 하는 학생들과 덜 잘 하는 www.acmicpc.net 2. 풀이 다이나믹 프로그래밍 이용하면 된다. # 입력 n = int(input()) students = list(map(int,input().split())) g = [0 for _ in range(1+n)] # 다이나믹 프로그래밍을 이용하여 for i in range(n+1): ma = 0 mi = 10001 for j in range(i,0,-1): ma = max(ma..
1. 문제 출처 https://www.acmicpc.net/problem/12865 12865번: 평범한 배낭 첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000) www.acmicpc.net 2. 풀이 해당 문제는 흔히 Knapsack 알고리즘 문제이다 가방의 담을 수 있는 무게가 정해져 있을 때, 최대한 가치를 가지도록 배낭을 싸는 문제이다.. 이를 다음과 같이 정의할 수있다. 1.현재 배낭의 한계량 보다 큰 무게의 물건은 넣지 않는다. 2.현재 배낭의 한계량 보다 작은 무게라면 더 좋은 가치의 물건을..
1. 문제 출처 https://www.acmicpc.net/problem/14501 14501번: 퇴사 첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다. www.acmicpc.net 2. 풀이 동적 계획을 사용하여 구하였다.. # # 다이나믹 프로그래밍 # # Botton_top 방식 # 입력 받기 n = int(input()) T = [0]*n P = [0]*n for idx in range(n): T[idx],P[idx] = map(int,input().split()) results = [0]*(n+1) def solution(): # N 번 반복한다. for day in range(n): # 상담 종료날 end = day + T[day] # 상담 종료날이 n+1보다 작거나 같으면 if end