치춘짱베리굿나이스
[백준] 1463 본문
1로 만들기
풀이
const makeOne = () => {
let input = parseInt(
require("fs").readFileSync("/dev/stdin").toString().trim()
);
let dp = Array.from({ length: 1000001 }, (n) => 0);
for (let i = 2; i <= input; i++) {
dp[i] = dp[i - 1] + 1;
if (i % 2 === 0) dp[i] = dp[i] < dp[i / 2] + 1 ? dp[i] : dp[i / 2] + 1;
if (i % 3 === 0) dp[i] = dp[i] < dp[i / 3] + 1 ? dp[i] : dp[i / 3] + 1;
}
console.log(dp[input]);
};
makeOne();
반성회
N을 2 or 3으로 나누거나 1을 빼는 연산을 계속 반복하여 1로 만들 때
- 최소 횟수가 보장이 되지 않음
- 조건문이 반복되어 시간복잡도가 늘어남
⇒ 거꾸로 1부터 N까지 도달하는 데에 걸리는 최소횟수를 구한다
N의 범위는 1부터 100만까지 ⇒ 길이 1,000,001만큼의 배열 선언 (마지막 인덱스가 100만)
1부터 N까지 모든 자연수에 대해 최소 연산 횟수 계산
i
에서i - 1
에 도달하기까지1을 빼는 연산
이 1번 필요하므로dp[i] = dp[i - 1] + 1
(
i
가 2의 배수일 경우)i
에서i / 2
에 도달하기까지 2로 나누는 연산이 1번 필요하다단
i - 1
에서i
에 도달했을 때 연산 횟수가i / 2
에서i
에 도달했을 때의 연산 횟수보다 작을 수 있으므로 크기 비교하여 더 작은 횟수를dp[i]
에 저장(
i
가 3의 배수일 경우)i
에서i / 3
에 도달하기까지 3으로 나누는 연산이 1번 필요하다단
i - 1
에서i
에 도달했을 때 또는i / 2
에서i
에 도달했을 때 연산 횟수가i / 3
에서i
에 도달했을 때의 연산 횟수보다 작을 수 있으므로 크기 비교하여 더 작은 횟수를dp[i]
에 저장
dp[N]
출력
'Javascript + Typescript > 자바스크립트로 알고리즘풀기' 카테고리의 다른 글
[백준] 7287 (0) | 2022.03.18 |
---|---|
[백준] 6749 (0) | 2022.03.18 |
[백준] 17478 (0) | 2022.03.17 |
[백준] 1780 (0) | 2022.03.17 |
[백준] 2630 (0) | 2022.03.17 |
Comments