티스토리 뷰
첫 번째 궁금증, what?
다이나믹 알고리즘이 무엇인가?
1. 다이나믹 알고리즘은 동적계획법이라고도 한다.
전체 문제를 작은 문제 여러개로 분화하여 생각하고 작은 문제들에서 구한 해답을 사용해 전체 문제를 해결하는 알고리즘이다.
- tip : 작은 문제들을 해결한 답을 구할 때마다 이후, 큰 문제를 풀때 사용하기 위해 저장해놔야한다.
2. 최적화 결과값을 찾기 위해 사용되는 알고리즘이다.
두 번째 궁금증, why?
다이나믹 알고리즘을 왜 사용하는가?
- 큰 문제를 작은 문제로 나눠서 조건에 맞는 값을 계속하여 수정하게 되어 모든 가능성을 고려하게 된다.
- 따라서, 최적화된 해를 구하기 위해서 동적계획법을 사용한다.
세 번째 궁금증, how?
다이나믹 알고리즘을 어떻게 활용할 수 있을까?
- table 배열을 설정해 작은 문제마다 최적화 값을 저장하고 큰 문제에 작은 문제의 최적화 값을 활용해 최종 값을 구할 수 있다.
예) 극장 좌석 문제 - 백준 2302번
2302번: 극장 좌석
주어진 조건을 만족하면서 사람들이 좌석에 앉을 수 있는 방법의 가짓수를 출력한다. 방법의 가짓수는 2,000,000,000을 넘지 않는다. (2,000,000,000 < 231-1)
www.acmicpc.net
- table생각하기
기준 : 사람수(입장권 번호 순서대로)
결과값 : 이전 사람들끼리 만들 수 있는 자리의 경우의 수 + 앞으로 자리를 옮길 수 있을 때의 경우의 수
>>vip가 모든 경우 없다고 가정하자.
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
1 | 1(1명일 때의 경우의 수)+1(옮길때) | 2(2명일 때의 경우의 수)+1(1명일 때의 경우의 수) | 3(3번좌석의 경우의 수)+2(2번 좌석의 경우의 수) | 5+3 | 8+5 | 13+8 | 21+13 | 34+21 |
9명 모두 앞으로 자리를 옮길 수 있다면, 최종적으로 나올 수 있는 최대 경우의 수는 55가지가 된다.
- 3명일때부터 알고리즘 적용이 시작
ex) 3명일 때
table[i-1]을 설명!
->2명이 만들 수 있는 좌석에 마지막으로 들어온(3번째 사람) 사람이 앉는 경우 = 2명이 만드는 좌석의 경우
table[i-2]를 설명!
-> 3번좌석과 2번좌석의 사람이 바뀐 것은 고정(맨뒤의 둘의 위치는 고정), 따라서 i-2(두명을 뺀 앞서 들어온 나머지)일때의 최적화 값을 table에서 읽어옴
- check배열
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 0 |
>> 해당문제는 check배열의 값이 1일 때 = 좌석을 앞으로 옮길 수 없을 때로 설정한다.
1) vip좌석인경우
2) vip좌석 뒷좌석일 경우
해당 두가지 모두 좌석을 앞으로 옮길 수 없기에, check배열에 1을 저장한다.
>>vip 좌석을 고려해서 table을 생각하자.
>> 해당 문제는, if문을 사용해, 앞으로 옮길 수 있을지 확인 후(check배열이 '0'일때) table 최적화 값을 계산한다.
좌석을 옮길 수 있을 경우, table[i-2]+ table[i-1]
좌석을 옮길 수 없을 경우, table[i-1]
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
1 | 1or2 | table[1]+table[2] | table[3] | table[3] | table[5]+table[4] | table[6] | table[6] | table[7]+table[8] = 12 |
해당예제에 대한 c언어 코드가 필요할 경우, 댓글 남겨주세요!
'c언어 알고리즘 > 다이나믹' 카테고리의 다른 글
백준 1679-숫자놀이 (0) | 2021.03.11 |
---|
- Total
- Today
- Yesterday
- 백준 11053 파이썬
- c++덱
- stack 컨테이너
- 핀테크 트렌드
- mm1queue
- 영화 리뷰 긍정 부정 분류
- 시뮬레이션 c
- 효율적인방법찾기
- 코딩월드뉴스
- CSMA/CD란?
- 백준 숫자놀이
- DRF 회원관리
- 백준 15650 파이썬
- CREATE ASSERTION
- 모듈 사용법
- 백준 4963
- 온라인프로필 만들기
- 기본 텍스트 분류
- 백트래킹(1)
- 11053 백준
- 기사작성 대외활동
- 4963 섬의개수
- 딥러닝입문
- 10866 백준
- 13886
- 소프트웨어공학설계
- 파이썬 알아두면 유용
- LAMBDA
- 스택 파이썬
- 백준 10866
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |