본문 바로가기
CS+PS/Algorithm

[DP][백준] 9095 - 1, 2, 3 더하기 + DP 에 대해서 생각해보기...

by SolaBreeze 2023. 7. 31.

dp 문제는 구현에서 애를 먹지 않는다.

그럼 dp에서 중요한 부분은 무엇이냐... 바로 아이디어와 발상이다!

그리고 제일 중요한 부분은 이 문제가 DP 문제인지 알아 차리는 것이다!!!

 

요즘 dp 문제를 중점적으로 풀어보고 있는데, 앞의 항과 뒤에 항의 연관성이 있는지 살펴보고 연관성이 있으면 dp문제라고 거즌 생각하고 푼다!

이렇게 앞의 항과 뒤의 항 사이에 연관성이 있는것을 점화식이 있다! 라고 나는 표현한다.

동적계획법(DP)은 문제를 쪼개서 작은 문제의 답을 구하고, 그걸로 더 큰 문제의 답을 구하는것을 반복하는 분할정복과 비슷하다고 생각한다. 

 

이 문제가 DP 문제라는것을 알아챈 이후에는, 이 문제의 점화식을 찾고 구현해내면된다!

구현 방법으로는 두가지가 있다. 

Top-down : 재귀(함수)를 이용한 방법이다. 큰 것(구하려는 것)에서 작은 것(초기값)까지 내려오면서 값을 구하는 방식이다. 

Bottom-up : 반복문(for문)을 이용한 방법이다. 작은 것(초기값)에서 큰 것(구하려는 것)으로 올라가면서 값을 구하는 방식이다.

 

이때 재귀나 반복문을 사용하면 시간복잡도에서 문제가 생길 수 있는데, 이 부분은 중복 연산 방지를 위한 cache를 이용하면 좋다.(이걸 메모이제이션Memoization이라고 부른다고 하던데...)

메모이제이션은 주로 필요한 부분 문제들만 구하는 탑다운 방식에서 사용된다. 이 방식을 Lazy-Evaluation이라고도 한다.

바텀업은 초기값부터 구하는 값으로 타고 올라가기 때문에 모든 항의 답을 미리 구해놓는 타뷸레이션Tabulation 방식을 사용한다. 이 방식을 Eager-Evaluation이라고도 한다.

 


자 이제, 본격적으로 백준 9095번 문제를 풀어보도록 하자..!

문제

정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 7가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다.

  • 1+1+1+1
  • 1+1+2
  • 1+2+1
  • 2+1+1
  • 2+2
  • 1+3
  • 3+1

정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다. n은 양수이며 11보다 작다.

출력

각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다.

예제 입력 1 복사

3
4
7
10

예제 출력 1 복사

7
44
274

 

그냥 눈으로만 보았을땐, 앞 뒤 항의 연관성을 1도 알 수가 없다.(ps초보인 내 머리로는...)

이럴땐 무작정! 순서대로 빈 종이에 적어보면서 규칙을 찾아보는 방법이 좀 통한다...

 

 

 

 

 

'CS+PS > Algorithm' 카테고리의 다른 글

[알고리즘]그리디  (1) 2023.09.11
[브루트포스][백준]1018-체스판 다시 칠하기  (0) 2023.09.10
예외처리  (0) 2023.07.03
뮤터블과 이뮤터블  (0) 2023.07.03
파이썬 입출력 참고  (0) 2023.07.03