백준 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. 이러한과정을 반복한다.

좋은 웹페이지 즐겨찾기