본문 바로가기

알고리즘 관련/BOJ

1, 2, 3 더하기 시리즈

1, 2, 3 더하기 시리즈는 DP 문제의 감을 잡기 좋은 것 같다.

푸는 문제마다 업데이트 할 예정이고, 푼 문제들을 정리할 겸 어떻게 접근하는지 간략하게 적어본다.

각 문제마다 Top Down, Bottom up 두 가지 방식으로 풀어보는걸 추천한다.

1, 2, 3 더하기

n의 크기가 작기 때문에 메모이제이션을 쓰지 않아도 풀리는 문제이다.

1, 2, 3 더하기 3

접근 : 

n의 크기가 10^6이기 때문에 모든 경우를 다 계산하면 시간초과가 발생한다.

잘 생각해보면, 답을 구하는데 부분 문제가 겹치는걸 알 수 있다.

 

풀이 : 

점화식을 세워보면 다음과 같다.

dp[N] = dp[N - 1] + dp[N - 2] + dp[N - 3]

1, 2, 3 더하기 4

접근 : 

순서와는 상관 없이 사용된 수의 개수가 같으면, 같은 경우로 치는 조건이 추가되었다.

그렇다면 중복을 어떻게 제거할 수 있을까

예시를 보면서 테이블을 설계해보자

4를 만들어야 하는 경우

1 + 1 + 1 + 1

1 + 1 + 2

2 + 2

1 + 3

보통 순서와 상관 없이 판단하기 위해서 먼저 만들어지는 경우를 기준점으로 삼는데, 이 문제에선 오름차순으로 기준을 삼는다.

오름차임을 판단하기 위해서는 이전에 사용했던 숫자가 무엇인지 알아야 한다. 그런데, 1차원 테이블로는 기록할 수 없다. 따라서, 2차원 테이블로 차원을 늘려 이전에 사용한 숫자를 기록한다.

즉, 점화식을 세우면 다음과 같다.

dp[N][1] = dp[N - 1][1]

dp[N][2] = dp[N - 2][1] + dp[N - 2][2] //2를 사용하면서, 마지막 숫자가 1, 2인 경우

dp[N][3] = dp[N - 3][1] + dp[N - 3][2] + dp[N - 3][3] //3을 사용하면서 마지막 숫자가 1,2,3인경우

1, 2, 3 더하기 5

접근 : 

같은 수를 연속해서 사용할 수 없는 조건이 걸렸다.

연속임을 판단하기 위해선 이전에 사용했던 숫자가 무엇인지를 알아야 한다. 그런데, 1차원 테이블로는 이전에 사용했던 숫자를 알 수 없기 때문에 차원을 늘리는 접근을 해야 한다.

즉, 테이블에 기록되는 정보는 N을 만드는 경우의 수 + 마지막으로 사용한 숫자가 동시에 기록이 되어야 한다.

 

풀이 : 

점화식을 세워보면 다음과 같다.

dp[N][1] -> 마지막 숫자로 1을 사용하여 N을 만드는 방법의 수

dp[N][1] = dp[N - 1][2] + dp[N - 1][3]

dp[N][2] = dp[N - 2][1] + dp[N - 2][3]

dp[N][3] = dp[N - 3][1] + dp[N - 3][2]

Answer = dp[N][1] + dp[N][2] + dp[N][3]

'알고리즘 관련 > BOJ' 카테고리의 다른 글

17472 다리 만들기 2  (0) 2021.03.22
16235 나무 재테크  (0) 2021.03.22
3190 뱀  (0) 2021.03.12
14890 경사로  (0) 2021.03.11
14891 톱니바퀴  (0) 2021.03.08