-
9506. [JavaScript]약수들의 합JavaScript_알고리즘/Bronze I 2024. 6. 17. 19:40
1. 문제
https://www.acmicpc.net/problem/9506
2. 접근 방법
- 시간 제한: 2초
- 메모리 제한: 128MB
- 수학
- 구현
- 정수론
3. 자바스크립트 코드
// 인풋 처리 부분 const fs = require("fs"); const input = fs.readFileSync("./9506.txt").toString().trim().split("\n"); // of 를 통해서 input 값 순회 for (num of input) { // String 으로 되어있는 부분 int 로 치환하여 -1 인 경우 반복문 탈출 (사실 필요없음 한번에 읽기 때문에) if (parseInt(num) === -1) { break; } else { // value 로 num 이라는 변수 Int 변환 const value = parseInt(num); // 리스트 생성 let numList = Array(); // 반복문을 value 재곱근 까지 진행 for (let i = 1; i <= Math.sqrt(value); i++) { // value 값이 나눠 떨어질 경우 if (value % i === 0) { // 공약수기 떄문에 리스트에 추가 numList.push(i); // 1로 나눈 경우 제외하고 리스트 추가 if (num / i !== value) { numList.push(num / i); } } } // 숫자가 큰 순서대로 정렬 numList.sort((a, b) => { return a - b; }); // reduce 초기값 선언 const init = 0; // reduce 통해서 총합 구하기 const total = numList.reduce((acc, current) => acc + current, init); // 공약수들 총합이 원래 수와 같은경우 if (total === value) { // 값들 문자열로 변환하여 + 기호 붙여서 변수에 저장 let ans = value + " = "; for (i in numList) { // 마지막 경우 "+" 기호 제외 if (parseInt(i) !== numList.length - 1) { ans += numList[i] + " + "; } else { ans += numList[i]; } } // ans 변수 출력 console.log(ans); // 외의 경우 아래 문구 출력 } else { console.log(`${value} is NOT perfect.`); } } }
4. 문제를 풀고난 후 생각
- 약수의 개수를 구하는 부분에 있어서 제곱근 까지만 구해도 충분하기 때문에 반복문을 제곱근 까지만 진행했다.
- 이후 과정의 경우 제곱근 까지 구했으면 그 구한 값들로 원래 값을 나눠주면 그 값들이 모두 공약수가 된다.
- 정수론에 대해서 개념을 되짚어볼 수 있던 문제였다.
5. 문제를 푸는데 도움이 되는 지식
- 수학
- 정수론
- 구현
'JavaScript_알고리즘 > Bronze I' 카테고리의 다른 글
1526. [JavaScript]가장 큰 금민수 (0) 2024.07.16 4344. [JavaScript]평균은 넘겠지 (0) 2024.06.17 2163. [JavaScript]초콜릿 자르기 (0) 2024.06.17