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 | 31 |
Tags
- DP
- dfs
- Java
- 파이썬
- SQL
- 오블완
- 소프티어
- Lv. 1
- javascript
- Lv. 3
- bfs
- Python
- LEVEL 2
- group by
- 자바스크립트
- select
- level 3
- Lv. 0
- SQL 고득점 KIT
- softeer
- join
- 프로그래머스
- 깊이 우선 탐색
- Lv. 2
- programmers
- 너비 우선 탐색
- 동적계획법
- 티스토리챌린지
- C언어
- Dynamic Programming
Archives
- Today
- Total
몸과 마음이 건전한 SW 개발자
프로그래머스 [Lv. 3] 에어컨 {언어 : JavaScript} [다시 풀어 보기] 본문
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/214289
정답 코드
function solution(temperature, t1, t2, a, b, onboard) {
// 계산을 편리하게 하기 위해서 -10 <= t <= 40인 범위를 0 <= t <= 50으로 바꾼다.
const t = temperature + 10;
t1 += 10;
t2 += 10;
const n = onboard.length;
const dp = Array.from({length: n}, () => Array(51).fill(Infinity));
dp[0][t] = 0;
const isValid = (i, temp) => !onboard[i] || (t1 <= temp && temp <= t2);
// ht 는 hope temperature
for (let i = 0; i < n-1; i++) {
for (let ht = 0; ht < 51; ht++) {
if (dp[i][ht] === Infinity) {
continue;
}
// 에어컨 끄는 경우
const temp = ht < t ? ht+1 : ht > t ? ht-1 : ht;
if (isValid(i+1, temp)) {
dp[i+1][temp] = Math.min(dp[i+1][temp], dp[i][ht]);
}
// 에어컨을 작동시키는 경우
for (const [newHt, cost] of [[ht+1, a], [ht-1, a], [ht, b]]) {
if (!isValid(i+1, newHt) || -1 >= newHt || newHt >= 51) {
continue;
}
dp[i+1][newHt] = Math.min(dp[i+1][newHt], dp[i][ht] + cost);
}
}
}
const answer = Math.min(...(dp.at(-1)));
return answer;
}
풀이 방법
- 주어진 온도 범위를 0부터 50까지로 변환하여 계산의 편리성을 높인다.
- dp 배열을 사용해 시간별 가능한 온도 상태를 추적하며 최소 비용을 저장한다.
- 초기 상태로 현재 온도에서 비용 0을 설정하고, 나머지 온도는 무한대로 초기화한다.
- 각 시간대에서 현재 온도 ht에 대해 온도를 변경하지 않고 유지하거나, 증가 또는 감소시켜 에어컨을 작동하지 않는 경우를 처리한다.
- 에어컨을 작동하는 경우 온도를 1도 올리거나 내리거나 유지할 수 있으며, 이때 각각의 비용을 고려하여 dp 배열을 업데이트한다.
- 각 경우의 온도 변화를 검토할 때, 설정된 온도 범위를 벗어나지 않는지 검증한다.
- 마지막 시간대에서 최소 비용을 찾기 위해 dp 배열의 마지막 행에서 가장 작은 값을 구한다.
- 최종 최소 비용을 반환하여, 주어진 조건을 만족하면서 온도 조절에 드는 최소 비용을 계산한다.
느낀점
- dp일거라고 생각은 했으나 이렇게도 풀 수 있다는 것을 알았다.
- 파이썬이나 Java로 다시 풀어보자.
'알고리즘 > 다시 풀어 보기' 카테고리의 다른 글
프로그래머스 [Lv. 4] 무지의 먹방 라이브 {언어 : JavaScript} [다시 풀어 보기, 힙X] (0) | 2024.11.25 |
---|---|
프로그래머스 [Lv. 3] 아방가르드 타일링 {언어 : JavaScript} [다시 풀어 보기] (1) | 2024.11.14 |
프로그래머스 [Lv. 3] 사라지는 발판 {언어 : Python} [다시 풀어 보기] (0) | 2024.11.06 |
Softeer [Level 3] 나무 수확 {언어 : JavaScript} [다시 풀어 보기] (1) | 2024.11.05 |
Softeer [Level 3] [HSAT 6회 정기 코딩 인증평가 기출] 출퇴근길 {언어 : JavaScript} [다시 풀어 볼것, 런타임에러 해결] (1) | 2024.10.31 |