백준/DP

[백준] 다이나믹 프로그래밍(DP) - "1, 2, 3 더하기" 시리즈

MoveForward 2023. 1. 15. 13:52

[시리즈 접근 방법]

 

** [1, 2, 3 더하기] 시리즈에서 중요한 것은 N을 만들기 위해 사용할 수 있는 숫자는 1 , 2 , 3 뿐이라는 것이다.

 

이 당연한 말이 뭐가 중요한가 싶겠지만,

사용 가능한 숫자가 1, 2, 3 뿐이라는 것은 dp[N] 에 영향을 줄 수 있는 원소들은

dp[N - 1] , dp[N - 2], dp[N - 3] 뿐이라는 것이다.

따라서 점화식 dp[N]은 dp[N - 1] , dp[N - 2], dp[N - 3]을 이용하여 만들어진다.


9095번 - 1, 2, 3 더하기

https://notorious.tistory.com/167

 

[백준] 400 - 다이나믹 프로그래밍 1 : 1, 2, 3 더하기 (!) (9095번 JAVA)

[백준] 400 - 다이나믹 프로그래밍 1 : 1, 2, 3 더하기 (!) (9095번 JAVA) [접근 방법] 1을 나타내는 방법 : 1가지 {1} 2를 나타내는 방법 : 2가지 {2} , {1,1} 3을 나타내는 방법 : 4가지 {3} , {2, 1}, {1, 2}, {1, 1, 1}

notorious.tistory.com

 

12101번 - 1, 2, 3 더하기 2

https://notorious.tistory.com/171

 

[백준] 400 - 다이나믹 프로그래밍 1 : 1, 2, 3 더하기 2 (!) (12101번 JAVA)

[백준] 400 - 다이나믹 프로그래밍 1 : 1, 2, 3 더하기 2 (!) (12101번 JAVA) [접근방법] 정수 n을 1,2,3의 합으로 나타내는 방법 중 사전 순으로 k 번째 오는 식을 구하는 프로그램을 작성해야 한다. 따라서,

notorious.tistory.com

 

15988번 - 1, 2, 3 더하기 3

https://notorious.tistory.com/172

 

[백준] 400 - 다이나믹 프로그래밍 1 : 1, 2, 3 더하기 3 (15998번 JAVA)

[백준] 400 - 다이나믹 프로그래밍 1 : 1, 2, 3 더하기 3 (15998번 JAVA) [접근방법] 기존 [1, 2, 3 더하기] 문제와 동일하다. n의 범위가 1_000_000 까지 확장된 점이 다르다. 때문에 1,2,3으로 구성한 n의 수식의

notorious.tistory.com

 

15989번 - 1, 2, 3 더하기 4

https://notorious.tistory.com/173

 

[백준] 400 - 다이나믹 프로그래밍 1 : 1, 2, 3 더하기 4 (!) (15989번 JAVA)

[백준] 400 - 다이나믹 프로그래밍 1 : 1, 2, 3 더하기 4 (!) (15989번 JAVA) [접근 방법] 수식이 오름차순으로 정렬되어있어야 중복이 발생하지 않는다. dp[ i ] 의 수를 구하기 위해선 dp[ i - 1 ] 의 방법 에 "

notorious.tistory.com

 

15990번 - 1, 2, 3 더하기 5

https://notorious.tistory.com/170

 

[백준] 400 - 다이나믹 프로그래밍 1 : 1, 2, 3 더하기 5 (!) (15990번 JAVA)

[백준] 400 - 다이나믹 프로그래밍 1 : 1, 2, 3 더하기 5 (!) (15990번 JAVA) [접근방법] ** [1, 2, 3 더하기] 시리즈에서 중요한 것은 N을 만들기 위해 사용할 수 있는 숫자는 1 , 2 , 3 뿐이라는 것이다. 이 당연

notorious.tistory.com

 

15991번 - 1, 2, 3 더하기 6

https://notorious.tistory.com/175

 

[백준] 400 - 다이나믹 프로그래밍 1 : 1, 2, 3 더하기 6 (!) (15991번 JAVA)

[백준] 400 - 다이나믹 프로그래밍 1 : 1, 2, 3 더하기 6 (!) (15991번 JAVA) [접근 방법] 이 문제의 점화식을 찾는 것은 굉장히 어렵다. (내 기준) 주먹구구식으로 계속해서 구해보았다. dp[1] = 1; // 1 dp[2] = 2

notorious.tistory.com

 

15992번 - 1, 2, 3 더하기 7

https://notorious.tistory.com/176

 

[백준] 400 - 다이나믹 프로그래밍 1 : 1, 2, 3 더하기 7 (15992번 JAVA)

[백준] 400 - 다이나믹 프로그래밍 1 : 1, 2, 3 더하기 7 (15992번 JAVA) [접근 방법] 2차원 배열로 dp를 선언해야 한다. dp[n][m] = dp[수식의 합][수식의 수 개수] 로 정의한다. long[][] dp = new long[1_001][1_001]; dp[1

notorious.tistory.com

 

15993번 - 1, 2, 3 더하기 8

https://notorious.tistory.com/177

 

[백준] 400 - 다이나믹 프로그래밍 1 : 1, 2, 3 더하기 8 (15993번 JAVA)

[백준] 400 - 다이나믹 프로그래밍 1 : 1, 2, 3 더하기 8 (15993번 JAVA) [접근 방법] 2차원 배열로 구성해야 한다. 수식에서 숫자가 홀수개로 구성된 것과 짝수개로 구성된 것을 따로 저장해야 한다. 정수

notorious.tistory.com

 

16195번 - 1, 2, 3 더하기 9

https://notorious.tistory.com/178

 

[백준] 400 - 다이나믹 프로그래밍 1 : 1, 2, 3 더하기 9 (16195번 JAVA)

[백준] 400 - 다이나믹 프로그래밍 1 : 1, 2, 3 더하기 9 (16195번 JAVA) [접근 방법] 15992번 [1, 2, 3 더하기 7] 문제와 아주 유사한 문제이다. 이전에는 각 수식이 몇개의 숫자로 이루어졌는지를 구해야했다

notorious.tistory.com


1,2,3 더하기 시리즈를 마치며 느낀점.

 

1부터 절반 가량은 혼자 점화식을 도출하지 못하였다.

점화식이 한눈에 보이지 않았고, dp 배열도 어떠한 형식으로 구성해야 하는지 감이 오지 않았다.

 

하지만, 문제를 점점 해결해 나가고, 다른 사람의 포스팅을 검색하여 이해해가며, 어느정도 감이 오기 시작하였다.

 

1, 2, 3 만을 사용한다는 것은 dp[n]의 점화식을 구성하는데 3개의 dp[] 배열의 원소가 사용된다는 것.

dp[] 배열은 2차원 배열로도 구성할 수 있다는 것이다.

dp[n][m] 중 m의 자리는 문제에서 내가 중점에 두고 싶은 값을 사용하여 해결한다.

예를 들어, '수식의 마지막 수' 라던가, '수식을 구성하는 수의 개수' 혹은 '수식을 구성하는 수의 개수가 짝수인가 홀수인가를 판단하는 flag' 등 이다.

 

점화식이 곧바로 도출되지 않을 때는 주먹구구식으로 dp의 원소들을 구해나가야 한다는 것도 깨닫았다.

 

앞으로 다양한 형식의 DP 문제도 이 경험을 활용하여 해결해 나갈 것이다.