Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- ChatGPT
- 인프런
- ArrayList 개념
- 자료구조
- 이것이 자바다 13장
- 이노캠
- 자바
- BFS
- 이것이 자바다
- JAVA 기초
- 자바의 정석 6장
- 이노베이션캠프 동북
- 채팅GPT
- 조건문과 반복문
- Java
- 백준
- 자바 언어 기초
- 트리 지름 구하기
- 웹개발 기본지식
- 이노베이션캠프
- dfs
- Til
- 스프링 입문강의
- 이것이 자바다 연습문제
- 3장 확인문제
- 챗GPT 명령어 작성팁
- 이노베이션 캠프
- 객체지향
- 이것이 자바다 확인문제
- Comparable과 Comparable
Archives
- Today
- Total
기록공간
[TIL] 05.29 본문
반응형
📙 공부 한 것
알고리즘
-1003 다리놓기 (동적계획법)
-1010 피보나치함수 (동적계획법)
-1436 영화감독 숌
- 동적계획법
🔍 시도해본 것
서로 다른 N개중 중복을 허용하지 않고 r개를 뽑는 경우의 수를 작성해야하는데,
이 방법을 코드로 메모이제이션을 이용해서 구현하는 방법을 몰랐다.
예를들면, 4개의 동쪽다리와 3개의 서쪽다리가 있을때,
(3,1,4) 와 (1,3,4)를 동일하게 한가지 경우의 수로 세아리는 것이다. (크로스x)
💡 알게된 점
조합 공식의 성질
dp[i][j] = dp[i-1][j-1] + dp[i-1][j]
dp[i][j] =1 , dp[i][0] = 0
위 두 가지 조합성질을 이용해서, 메모이제이션을 이용해 동적계획법으로 구현할 수 도있다.
동적계획법이란?
큰 문제를 작은 문제로 나누어 푸는 알고리즘 기법이다. 이를 통해, 중복되는 계산을 피하고 효율적으로 문제를 해결할 수 있다.
예시 : 피보나치 수열
fib(0) = 0
fib(1) = 1
fib(n) = fib(n-1) + fib(n-2) (N=2),
이를 재귀함수로 구현하면 다음과 같다.
1
2
3
4
5
6
7
8
9
10
|
public static int fib(int n) {
if (n == 0) {
return 0;
} else if (n == 1) {
return 1;
} else {
return fib(n-1) + fib(n-2);
}
}
|
cs |
하지만 위 방법은 n이 커질 수록, 지수적으로 시간이 증가해서 비효율적인 코드이다.
동적 계획법을 사용해서 피보나치 수열을 구하는 방법은 다음과같다.
1
2
3
4
5
6
7
8
9
10
|
public static int fib(int n) {
int[] memo = new int[n+1];
memo[0] = 0;
memo[1] = 1;
for (int i = 2; i <= n; i++) {
memo[i] = memo[i-1] + memo[i-2];
}
return memo[n];
}
|
cs |
위 코드에서는 memo에 이미 구한 값을 저장해서, 중복 계산을 피한다. 이를 통해, 피보나치 수열을 효율적으로 구할 수 있다.
반응형
'TIL(Today I Learned)' 카테고리의 다른 글
[TIL] 05.31 (0) | 2023.05.31 |
---|---|
[TIL] 05.30 (0) | 2023.05.30 |
[TIL] 05.26 개발일지 (1) | 2023.05.26 |
[TIL] 05.25 개발일지 (0) | 2023.05.25 |
[TIL] 05.23 개발일지 (0) | 2023.05.23 |