백준 11653번 소인수분해-JS
- 제출한 코드(안됨)
const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
let input = fs.readFileSync(filePath).toString().trim().split('\n');
let N = Number(input[0]);
let resultArr = [];
let final = [];
let answer = '';
// 자기자신보다 작은 수로 나누고 그걸 또 나누고
for(let i = 1; i <= N; i++) {
if((N%i) === 0) {
resultArr.push(i);
}
}
// console.log(resultArr);
final.push(resultArr[1]);
let num = N;
while(true) {
num = num/resultArr[1];
// console.log('num : '+ num);
if(num%resultArr[1] !== 0) {
break;
}
final.push(resultArr[1]);
}
let second;
for(let i = 2; i < resultArr.length; i++) {
if((num%resultArr[i]) === 0) {
second = resultArr[i];
break;
}
}
// console.log(second);
if(resultArr.length >= 4 && num > 1) {
final.push(second);
while(true) {
num = num/second;
// console.log('num : '+ num);
if(num%second !== 0) {
break;
}
final.push(second);
}
}
final.forEach(element => {
answer += element + '\n';
});
console.log(answer);
테스트를 바꿔가면서 문제점들을 수정했다.
코드를 설명하자면
1. N의 약수를 구한다
2. 그 약수중 1을 제외한 가장 작은수(first라하겠음)로 나눈다 더이상 first로 나누어지지 않기 전까지
3. 1과 first를 제외한 약수들 중 num(더이상 안나누어 지는 수)으로 나누어지는 가장 작은 수(second 변수를 사용)를 구한다.
4. second로 더이상 나누어 지지 않을 때까지 나눈다.
내 방식이 틀린건가?
아 저 일련의 과정을 약수가 다 할때까지 반복해야한다.
- 두번째시도(시간초과)
const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
let input = fs.readFileSync(filePath).toString().trim().split('\n');
let N = Number(input[0]);
let resultArr = [];
let final = [];
let answer = '';
// 자기자신보다 작은 수로 나누고 그걸 또 나누고
for(let i = 1; i <= N; i++) {
if((N%i) === 0) {
resultArr.push(i);
}
}
console.log(resultArr);
let num = N;
while (num !== 1) {
let smallNum;
for(let i = 1; i < resultArr.length; i++) {
if((num%resultArr[i]) === 0) {
smallNum = resultArr[i];
break;
}
}
console.log(smallNum);
if(resultArr.length >= 4 && num > 1) {
final.push(smallNum);
while(true) {
num = num/smallNum;
console.log('smallNum : '+ smallNum);
if(num%smallNum !== 0) {
break;
}
final.push(smallNum);
}
}
}
final.forEach(element => {
answer += element + '\n';
});
console.log(answer);
맞게 잘 돌아간다. 근데 시간초과 뜸!^^
쓸데없는 if문 없애니 잘돌아간다!
if(resultArr.length >= 4 && num > 1) {
이코드는 사실 필요없는 코드(반복문으로 돌려주니까)
- 세번째(드뎌 성공!)
const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
let input = fs.readFileSync(filePath).toString().trim().split('\n');
let N = Number(input[0]);
let resultArr = [];
let final = [];
let answer = '';
for(let i = 1; i <= N; i++) {
if((N%i) === 0) {
resultArr.push(i);
}
}
let len = resultArr.length;
while (N !== 1) {
let smallNum;
for(let i = 1; i < len; i++) {
if((N%resultArr[i]) === 0) {
smallNum = resultArr[i];
break;
}
}
final.push(smallNum);
while(true) {
N = N/smallNum;
if(N%smallNum !== 0) {
break;
}
final.push(smallNum);
}
}
final.forEach(element => {
answer += element + '\n';
});
console.log(answer);
진짜 문제풀이
1. N의 약수를 구한다.
2. N의 약수들 중 N으로 나누어지는 수중 가장 작은 수를 smallNum변수에 넣는다.
3. N을 smallNum으로 나누어서 더이상 나누어지지 않을때까지 나눈다.
3-1. 나눌어질때마다 final배열에 smallNum변수를 추가한다.
4. 이러한과정을 반복한다.
Author And Source
이 문제에 관하여(백준 11653번 소인수분해-JS), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@yoosk5485/백준-11653번-소인수분해-JS다른사람거-봐보기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)