•
회의 날짜: 2022/11/8 (화)
•
회의 장소: ZOOM 회의실
•
참석자: 김솔배, 구연지, 안지영
[이번 스터디 공부한 내용]
•
public class 더하기123 {
/*
정수 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의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오.
*/
//n이 11보다 작은 양수이기때문에 backtracking으로도 풀리지만, DP연습이기에 DP로 푼다.
/*
1 = 1
2 = 1,1 || 2
3 = 1,1,1 || 1,2 || 2, 1
4 = 1,1,1,1 || 1,2,1 || 2,1,1 ||
1,1,2 || 2,2 ||
1,3
5 = 1,1,1,1,1 || 1,2,1,1 || 2,1,1,1 || 1,1,2,1 || 2,2,1 || 1,3,1
1,1,1,2 || 1,2,2 || 2,1,2
1,1,3 || 2,3
*/
static int[] dp = new int[12];
public static int f(int n){
if(n == 1) return 1;
if(n == 2) return 2;
if(n == 3) return 4;
// int result = dp[n];
// if(result != 0) return result;
if(dp[n] != 0) return dp[n];
return dp[n] = f(n - 1) + f(n - 2) + f(n - 3);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for (int i = 0; i < T; i++) {
int N = sc.nextInt();
System.out.println(f(N));
}
}
}
JavaScript
복사
•
import sys
from itertools import product
# 중복 순열 돌리기
# 10=3*3+1 -> 4
# 3^10 = 59049 -> 6만번 * 4 -> 24만번 -> 돌릴만함
# 메모리...?
def how_many_case(x):
case = 0
lower = (x-1) // 3 + 1
for i in range(lower, x+1):
nums_list = product(range(1,4), repeat= i)
for nums in nums_list:
if sum(nums) == x:
case += 1
return case
testcase_num = int(input())
for i in range(testcase_num):
testcase = int(sys.stdin.readline().replace("\n", ""))
print(how_many_case(testcase))
Python
복사
•
HTML
복사
[어려웠던 부분]
•
DP를 사용하면서
점화식을 세우는 것이 어려웠습니다.
어떻게 한번 계산한 값을 저장 할지에 대한 방법을 생각하는것도 어려웠습니다.
HTML
복사
•
점화식을 활용한 케이스 간의 관계를 파악하는 것이 어려웠습니다.
그래서 그냥 itertools를 이용해서 경우의 수를 다 구했는데,
이 케이스에서만 유용한 것 같아 점화식과 재귀함수를 이용한 풀이를 연습해야할 것 같습니다.
Python
복사
•
HTML
복사
[금주의 느낀 점]
•
어떤 문제를 만났을때 DP를 사용해야 하는지 감을 잡은거 같습니다.
답이 작은 문제로 나누어지고 그 답이 최종 답과 연결되어있다면
DP를 생각해 보아야겠다고 느꼈습니다.
HTML
복사
•
코딩 테스트에서 제시한 조건들을 잘 보는 것이 중요하다는 것을 깨달았습니다
제한 조건이 작은 경우는 그냥 반복문 돌려서 케이스를 다 구해도 된다는 것을 느꼈습니다. :)
Plain Text
복사
•
HTML
복사