| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
Tags
- 정리
- 14940번
- 6593번
- 1541번
- node.js
- 13913번
- 2422번
- 17626번
- 타입스크립트
- 나이트의이동
- 백준
- 5427번
- 20365번
- 16953번
- 1926번
- 16439번
- 자바스크립트
- 7526번
- 123만들기
- 토마토
- 타입스크립트 프로그래밍
- 1969번
- 맥주마시면서걸어가기
- 2503번
- 한윤정이 이탈리아에 가서 아이스크림을 사먹는데
- 20300번
- 5014번
- 알고리즘
- javascript
- 풀이
Archives
- Today
- Total
Sqsung DevLog
[백준] 17626번: Four Squares - Node.js (자바스크립트) 본문
1. 문제 ㅡ 17626번: Four Squares (난이도: Silver III)
17626번: Four Squares
라그랑주는 1770년에 모든 자연수는 넷 혹은 그 이하의 제곱수의 합으로 표현할 수 있다고 증명하였다. 어떤 자연수는 복수의 방법으로 표현된다. 예를 들면, 26은 52과 12의 합이다; 또한 42 + 32 + 1
www.acmicpc.net
2. 풀이 ㅡ Node.js (자바스크립트)
const target = +require('fs').readFileSync('/dev/stdin').toString().trim();
const getMinNeeded = targetNumber => {
const dp = Array.from({ length: targetNumber + 1 }, () => 0);
dp[1] = 1;
for (let i = 2; i <= targetNumber; i++) {
let min = Number.MAX_SAFE_INTEGER;
// j 제곱이 i 보다 작거나 같을 떄까지
for (let j = 1; j * j <= i; j++) {
min = Math.min(min, dp[i - j * j]);
}
dp[i] = min + 1;
}
return dp[targetNumber];
};
console.log(getMinNeeded(target));
2-1. 풀이 설명
입력값으로 주어진 정수(target)를 만들기 위해 필요한 최소한의 제곱값을 구하는 문제다. Brute Force 알고리즘으로 접근하기에는 시간 제한이 0.5초였기에 Dynamic Programming을 사용해서 풀었다.
Dynamic Programming 구현을 위해 사용되는 점화식은 어렵지 않다. 26을 예시로 들었을 때, 26을 구하기 위해 필요한 최소한의 제곱수는 (26 - 1 = )25를 구현하기 위한 최소한의 제곱수(1) + 1이다. 따라서 j 제곱이 i 보다 작거나 같을 때까지 반복문을 돌면서 i를 만들기 위해 필요한 최소한의 제곱수를 구하고, dp[i] 의 값을 최소한의 제곱수로 업데이트 해줬다.
반복문이 끝난 후에는 dp배열의 targetNumber번째 값을 출력했다.
'Algorithm' 카테고리의 다른 글
| [백준] 1931번: 회의실 배정 - Node.js (자바스크립트) (0) | 2023.06.19 |
|---|---|
| [백준] 20365번: 블로그2 - Node.js (자바스크립트) (0) | 2023.06.16 |
| [백준] 14501번: 퇴사 - Node.js (자바스크립트) (0) | 2023.06.15 |
| [백준] 2503번: 숫자 야구 - Node.js (자바스크립트) (0) | 2023.06.14 |
| [백준] 9205번: 맥주 마시면서 걸어가기 - Node.js (자바스크립트) (0) | 2023.06.14 |