Dev/TIL
23/10/07
별과은하
2023. 10. 8. 00:13
[알고리즘]
1. 백준 - 2591 숫자카드
- TopDown, BottomUp 모두 가능
- 10, 20, 30과 같은 카드에서 나오는 0을 고려하지 않으면 틀린다.
- 그나마 쉬움
2. 백준 - 15486 퇴사2
- BottomUp이 Python은 되는데 Java로는 안됨
- 역순으로 마지막 날부터 앞으로 가면서 상담을 한 경우와 그렇지 않은 경우를 비교
- 그나마 쉬움
3. 백준 - 5557 1학년
- 해설 봄 (복습 필요)
- 핵심 : 가장 처음 카드는 이미 사용했다 치고 그 다음 숫자를 더하거나 뺀다.
- 마지막에 도착하고 목표 숫자가 맞다면 경우의 수 + 1
- 이미 값이 나왔거나 조건에 맞지 않으면 반환한다.
- 더하거나 빼는 경우를 다 포함하기 위해 DP함수를 각각 호출해야한다.
- 약간 어려움
4. 백준 - 2758 로또
- Bottom Up이 또 안됨 ㅡㅡ
- '특정한 숫자'를 만드는게 아니라, 모든(누적) 경우의 수를 찾는 것이다.
- 따라서 `dp[숫자 순서][고른 숫자]` 의 값은, 이전에 만들어진 경우도 누적한다.
- 그렇게하면 가장 마지막 위치에서 모든 경우의 수를 얻을 수 있다.
- 어려움
5. 백준 - 1106 호텔
- C명 이상을 만족하는 최소 비용
- 'C명 이상' 이라는 점에서, C를 초과하는 최소비용도 고려해야한다.
- 도시 하나씩 보면서 이제까지 cnt명일 때 얼마였는지 비교한다.
- 한 도시에서 '정수배'로 사람과 비용을 투자할 수 있기 때문에 여러번 사용할 수 있다.
- 따라서 사람 한명 한명씩 늘려가며 비용을 계산해야한다.
- 어려움
6. 백준 - 1520 내리막길
- DFS와 메모이제이션을 활용한다.
- 각 루트를 가면서 이 위치에 몇번의 경우로 도착할 수 있는지 보는건 맞다.
- 대신 이동할 때 DFS를 활용해서 끝까지 한번 간다.
- 그러면 오는 길에 경우의 수들이 누적되고, 나중에는 끝까지 가지 않아도 경우의 수를 활용할 수 있다.
7. 백준 - 7579 앱
- 보통 dp 테이블의 '값'이 정답인데, '인덱스' 가 정답인 케이스
- 왜냐하면 메모리 최대값이 너무 크기 때문이다.
- dp[비용] = 찾을 수 있는 최대 메모리 크기
- 비용은 역순으로 순회해야 같은 앱을 2번 이상 비활성화 시키는 일이 일어나지 않는다.