[Baekjoon] 9506 - 약수들의 합

Chobby·2023년 10월 11일
1

Baekjoon

목록 보기
32/108

😀문제

어떤 숫자 n이 자신을 제외한 모든 약수들의 합과 같으면, 그 수를 완전수라고 한다.

예를 들어 6은 6 = 1 + 2 + 3 으로 완전수이다.

n이 완전수인지 아닌지 판단해주는 프로그램을 작성하라.


😁입력

입력은 테스트 케이스마다 한 줄 간격으로 n이 주어진다. (2 < n < 100,000)

입력의 마지막엔 -1이 주어진다.


😂출력

테스트케이스 마다 한줄에 하나씩 출력해야 한다.

n이 완전수라면, n을 n이 아닌 약수들의 합으로 나타내어 출력한다(예제 출력 참고).

이때, 약수들은 오름차순으로 나열해야 한다.

n이 완전수가 아니라면 n is NOT perfect. 를 출력한다.


🤣예제

예제 입력 1 
6
12
28
-1
예제 출력 1 
6 = 1 + 2 + 3
12 is NOT perfect.
28 = 1 + 2 + 4 + 7 + 14

😃출처

  • ICPC > Regionals > North America > Pacific Northwest Regional > 2013 Pacific Northwest Region Programming Contest F번
  • 문제의 오타를 찾은 사람: jh05013, pkcchoi3
  • 데이터를 추가한 사람: seong954t
  • 문제를 번역한 사람: yukariko

😄알고리즘 분류

  • 수학
  • 구현
  • 정수론

😎나의 풀이

const input = require('fs').readFileSync('/dev/stdin').toString().split('\n').map(a => Number(a))
const result = []

// 약수를 구할 함수
function getDivisors(num) {
    if (num <= 0) return []
    const divisors = [1]
    for(let i = 2 ; i <= Math.floor(num/2) + 1 ; i ++) {
        if(num % i === 0) divisors.push(i)
    }
    return divisors
}

input.forEach(line => {
    const curDivisors = getDivisors(line)
    const curSum = curDivisors.reduce((acc, cur) => acc + cur, 0)
    let curStr = ""
    // 약수가 존재한다면, 즉 0 이하는 처리하지 않음
    if(curDivisors.length) {
        if(curSum === line) curStr = `${line} = ${curDivisors.join(" + ")}`
        else curStr = `${line} is NOT perfect.`
    }
    result.push(curStr)
})

console.log(result.join("\n"))
profile
내 지식을 공유할 수 있는 대담함

0개의 댓글