Closed Jewan1120 closed 1 month ago
🤔 시간복잡도 고려사항
💡 풀이 아이디어
DP
: 1,2,3 합으로 N을 만들 수 있는 방법 수를 구해야함
dp[i][j]
: i(1,2,3)으로 j만들기dp[i][j] = dp[1][j-i] + dp[2][j-i] + dp[3][j-i]
dp 잘 못해서... 점화식이 이쁘진 않은것 같다.
🤔 시간복잡도 고려사항
💡 풀이 아이디어
dp[i] = dp[i - 3] + n / 2 + 1
dp[i - 3]
: 3을 쓰면서 i를 만들 수 있는 경우의 수n / 2
: 2를 쓰면서 i를 만들 수 있는 경우의 수
1
: 숫자가 모두 1인 경우사실 질문 게시판 보다가 스포당해서 왜 이런 점화식이 나오는지 고민해봤습니다 ^_^,,ㅎ,,,,
🤔 시간복잡도 고려사항
O(N)
💡 풀이 아이디어
dp[0] = 1
(0을 1, 2, 3의 합으로 표현할 수 없지만 음수 인덱스 고려하여 1로 초기화)dp[n] = dp[n-1] + dp[n-2] + dp[n-3]
i=1
1을 이용한 경우 계산, i=2
2를 이용한 경우 추가 계산, i=3
3을 이용한 경우 계산작은 수부터 차례로 계산
하기에 이미 계산 된 결과에만 새로운 값을 더하기 때문
for(int i=1; i<=3; i++) { for(int j=i; j<10001; j++) { dp[j] += dp[j-i]; } }
int T = Integer.parseInt(br.readLine()); // 테스트 케이스 개수 T
for(int i=0; i<T; i++) { int N = Integer.parseInt(br.readLine()); System.out.println(dp[N]); }
- n값이 크지 않아서 먼저 dp배열 값을 모두 초기화해주는 방식으로 풀었는데,
- n값이 커지면 비효율적일 것 같습니다
🤔 시간복잡도 고려사항
dp로 해결 : O(N)
💡 풀이 아이디어
dp[i] += d[i-2]
dp[i] += dp[i-3]
🤔 시간복잡도 고려사항
💡 풀이 아이디어
for (int i = 1; i <= 3; i++)
for (int j = i; j < 10_001; j++)
dp[j] += dp[j - i];
dp 점화식 어렵네요.. 혜원님 아이디어가 도움이 됐습니다
🤔 시간복잡도 고려사항
O(n^2)
까지 가능
O(2^N)
으로 풀면 시간초과💡 풀이 아이디어
n=1 -> (1)
n=2 -> (1 1) (2)
n=3 -> (1 1 1) (1 2) (3)
n=4 -> (1 1 1 1) (1 1 2) (1 3) (2 2)
n=5 -> (1 1 1 1 1) (1 1 1 2) (1 2 2) (1 1 3) (2 3)
이때 n 이 될 수 있는 각 경우의 마지막 수가 (ex. (1 1) 경우의 마지막 수는 1) 1 2 3 마다 각각 몇번 나오는지 갯수를 셌을 때, 이 갯수의 총합이 n이 될 수 있는 전체 방법의 수가 된다
N 마다 1 2 3 이 마지막으로 올 때의 각 갯수가 모두 저장 되어 있을 때 →DP N 의 전체 방법의 수를 아래 규칙으로 찾을 수 있다.
(N -1의 첫번째 갯수) + (N-2의 첫번째 두번째 갯수) + (N-3의 첫번째 두번째 세번째 갯수)