일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- AI
- 코딩 테스트
- 구글 킥스타트
- 네트워크
- PYTHON
- 운영체제
- google coding competition
- 동적프로그래밍
- 브루트포스
- OS
- nlp
- 동적 프로그래밍
- 순열
- 코딩
- BFS
- 백준
- linux
- 프로그래밍
- dp
- 파이썬
- 리눅스
- 코딩테스트
- 킥스타트
- 딥러닝
- DFS
- 프로그래머스
- CSS
- kick start
- 그래프
- 알고리즘
- Today
- Total
목록동적프로그래밍 (15)
오뚝이개발자
nums=[1,2,1], target=3일 때, nums에서 원소의 합이 target인 부분집합은 몇 개일까? 답은 (1,2), (2,1)로 2개이다. 그렇다면 이를 구하기 위한 알고리즘은 무엇일까? 이러한 문제를 counting subsets with given sum이라 한다. 다른 문제에도 자주 이용되니 알아두자! 가능한 모든 경우를 파악해보면 된다. 그런데 이 때, 각 숫자는 합에 포함되거나 안되거나 둘 중 하나의 선택지를 갖는다. 그림으로 나타내면 아래와 같다. 이를 풀기 위해선 dp를 사용하면 된다. 위와 같이 dp를 모두 채운 뒤 dp[-1][-1]이 답이 된다. 관련 문제 leetcode.com/problems/target-sum/ Target Sum - LeetCode Level up y..
문제 programmers.co.kr/learn/courses/30/lessons/42898 코딩테스트 연습 - 등굣길 계속되는 폭우로 일부 지역이 물에 잠겼습니다. 물에 잠기지 않은 지역을 통해 학교를 가려고 합니다. 집에서 학교까지 가는 길은 m x n 크기의 격자모양으로 나타낼 수 있습니다. 아래 그림은 m = programmers.co.kr 풀이 DP를 사용해 푸는 문제이다. 문제에서 이동은 오른쪽과 아래쪽으로만 가능하다고 했으니, 한 지점까지 올 수 있는 가능한 경로는 그 지점의 위와 왼쪽칸으로부터이다. 따라서 각 칸마다 그 칸까지 도달가능한 경로의 수를 저장하면 된다. grid라는 n x m 2차원 리스트를 만들어 (0,0)에 1을 넣고, puddle에는 -1을 넣는다. 그 후, 이중for문으..
문제설명 아래와 같이 5와 사칙연산만으로 12를 표현할 수 있습니다. 12 = 5 + 5 + (5 / 5) + (5 / 5) 12 = 55 / 5 + 5 / 5 12 = (55 + 5) / 5 5를 사용한 횟수는 각각 6,5,4 입니다. 그리고 이중 가장 작은 경우는 4입니다. 이처럼 숫자 N과 number가 주어질 때, N과 사칙연산만 사용해서 표현 할 수 있는 방법 중 N 사용횟수의 최솟값을 return 하도록 solution 함수를 작성하세요. 제한사항 N은 1 이상 9 이하입니다. number는 1 이상 32,000 이하입니다. 수식에는 괄호와 사칙연산만 가능하며 나누기 연산에서 나머지는 무시합니다. 최솟값이 8보다 크면 -1을 return 합니다. 입출력 예 입출력 예에 대한 설명 풀이 혼자 생..
문제 https://www.acmicpc.net/problem/15990 15990번: 1, 2, 3 더하기 5 각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 1,000,000,009로 나눈 나머지를 출력한다. www.acmicpc.net 생각의 흐름 이전에 포스팅한 1, 2, 3 더하기 3과 유사하지만 차이점은 더할 때 같은 숫자가 연속으로 나오는 경우는 가짓수에 포함하지 않는다는 것이다. 그럼 이를 어떻게 구별해내야 하는가? 단순히 생각해보면 된다. 예컨대, 4를 만드는 가짓수를 구한다고 하자. 이 경우 가능한 case는 1, 2, 3을 만드는 case들에 각각 끝에 3, 2, 1을 더해주어서 만들어야 한다. 근데 이 때 주의할 점은 3을 더할때는 1을 만드는 case들 중..
문제 https://www.acmicpc.net/problem/1699 1699번: 제곱수의 합 어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다. 이 경우, 수학자 숌크라테스는 “11은 3개 항의 제곱수 합으로 표현할 수 있다.”라고 말한다. 또한 11은 그보다 적은 항의 제곱수 합으로 표현할 수 없으므로, 11을 그 합으로써 표현할 수 있는 제곱수 항의 최소 개수는 www.acmicpc.net 생각의 흐름 dp[i]에는 i라는 수를 만들기 위해 필요한 제곱수들의 최소 항의 갯수를 계산해 저장한다. 그 후 j를 1부터 sq..
문제 https://www.acmicpc.net/problem/2225 2225번: 합분해 첫째 줄에 답을 1,000,000,000으로 나눈 나머지를 출력한다. www.acmicpc.net 생각의 흐름 dp를 이용해 d[i][j]에는 i개를 더해 j가 되는 경우의 수를 저장한다. 그런데 생각을 해보면 d[i][j]=d[i][j-1]+d[i-1][j]라는 걸 알 수 있다. dp를 직접 표로 그려 계산해보면 이해가 좀 더 쉬울 것이다. 코드 # 백준 2225 n, k = list(map(int, input().split())) dp = [[0]*(n+1) for _ in range(k+1)] for i in range(n+1): dp[1][i]=1 for i in range(2, k+1): for j in ..
문제 https://www.acmicpc.net/problem/14002 14002번: 가장 긴 증가하는 부분 수열 4 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다. www.acmicpc.net 생각의 흐름 이전에 포스팅한 적이 있는 가장 긴 감소하는 수열과 유사하다. 차이점은 길이 뿐 아니라 수열까지도 출력한다는 것인데 이 때 뒤에서부터 순차적으로 출력해야한다는 것만 유념하면 된다. 코드 # 백준 14002 N = int(input()) arr = list(map(int, inpu..
문제 https://www.acmicpc.net/problem/11055 11055번: 가장 큰 증가 부분 수열 수열 A가 주어졌을 때, 그 수열의 증가 부분 수열 중에서 합이 가장 큰 것을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 인 경우에 합이 가장 큰 증가 부분 수열은 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 이고, 합은 113이다. www.acmicpc.net 생각의 흐름 각 자리에 있는 수를 선택하였을 때 올 수 있는 가장 큰 합을 dp 리스트에 저장한다. 예를 들어, 문제에서 예시로 주어진 arr = [1, 100, 2, 50, 60, 3, 5, 6, 7, 8]의 경우 dp = [1, 10..