한번씩 읽고 가세요.
“ 지연되는 프로젝트에 인력을 더 투입하면 오히려 더 늦어진다. ”
- Frederick Philips Brooks
Mythical Man-Month 저자
Happy Number
== 문제 설명 ==
양의 정수 S0 의 각 아라비아 숫자들의 제곱의 합으로 양의 정수 S1을 만든다고 하자.
동일한 방법이라면, S1으로 S2를 만들 수 있고, 이 후로도 계속 만들 수 있다.
만약 어떤 i(i ≥ 1)에 대해서 Si = 1이라면, 최초의 S0를 Happy Number라고 부른다.
Happy Number가 아닌 수를 Unhappy Number라고 부른다.
예를 들어, 7에서 시작하게 되면 다음과 같은 일련의 순서를 가지게 되며
7, 49(=7^2), 97(=4^2+9^2), 130(=9^2+7^2), 10(=1^2+3^2), 1(=1^2),
따라서 7은 즐거운 수이다.
그리고 4는
4, 16(4^2), 37(1^2+6^2), 58(3^2+7^2), 89(5^2+8^2), 145(8^2+9^2),
42(1^2+4^2+5^2), 20(4^2+2^2), 4(2^2)의 순서로 반복되므로 Unhappy Number이다.
== 입력 ==
첫 라인은 인풋 케이스의 수 n이 주어지며 이후 n라인의 케이스가 주어진다.
각 테스트 케이스는 한 개의 양의 정수 N으로 구성되며 N은 10^9 보다 작다.
== 출력 ==
출력은 주어진 수 N이 Happy Number인지 Unhappy Number인지 여부에 따라 다음과 같이 출력한다.
N이 Happy Number라면 “Case #p: N is a Happy number.”
N이 Unhappy Number라면 “Case #p: N is an Unhappy number.”
p는 1부터 시작하는 케이스의 번호이며 각각의 케이스는 한 줄에 결과를 표시한다.
== 샘플 인풋 ==
3
7
4
13
== 샘플 출력 ==
Case #1: 7 is a Happy number.
Case #2: 4 is an Unhappy number.
Case #3: 13 is a Happy number.
== 채점 기준 ==
- 작성한 프로그램은 각각의 테스트케이스에 대해서 올바른 결과를 출력하여야 한다.
- 입력 후 결과 출력까지 걸리는 시간이 빠르면 빠를수록 좋다.
(* 이번 문제는 정확한 결과만큼이나 속도도 중요합니다)
- 프로그램에서 사용한 자료구조 및 알고리즘이 적절하여야 한다.
- 그 외 일반적인 코드 구조, 스타일, 에러/예외 처리 등이 적절할수록 좋다.
UVA 10591 문제이고, 이스트소프트 개발직군 샘플문제로 공개된 자료를 가져왔습니다. 채점기준을 준수한다면 난이도는 좀 더 상승될 것 같습니다.
- 채점기준에서 속도가 중요하다 했는데, 대부분의 수들이 길지 않은 싸이클로 반복하다보니 처리시간은 순식간입니다. 수십, 수백만개의 Case에 대해 처리시간을 체크해봐야 차이가 날것 같습니다.
testcase = [3, 7, 4, 13]
function happyNumber(입력숫자){
let 더할숫자 = []
let 더한숫자 = 입력숫자
let 제곱의합리스트 = []
while (더한숫자 != '1'){
for (let i of 더한숫자){
let sq = parseInt(i) ** 2
더할숫자.push(sq)
}
더한숫자 = String(더할숫자.reduce((a, b) => a + b, 0))
console.log(더할숫자, 더한숫자, 제곱의합리스트)
더할숫자 = []
if (더한숫자 == 입력숫자){
return false
}
for (let i of 제곱의합리스트){
if(i === 더한숫자){
return false
}
}
제곱의합리스트.push(더한숫자)
}
return true
}
// happyNumber(String(7))
for (let i = 0; i < testcase.length; i++) {
if (happyNumber(String(testcase[i]))){
console.log(`Case #${i+1}: ${testcase[i]} is a Happy number.`)
} else {
console.log(`Case #${i+1}: ${testcase[i]} is an Unhappy number.`)
}
}
// 참고사항
function test(value){
value.forEach(v =>{
if (v === 10){
return false
}
})
return true
}
test([20, 30, 10, 40])
"행복한 숫자(Happy number)"인지 판별하는 함수인 happyNumber를 구현한 것입니다. 주어진 숫자를 기반으로 제곱의 합을 계산하여 반복적으로 수행하며, 결과가 1인지 여부를 확인하여 "행복한 숫자"인지 판별합니다.
happyNumber 함수는 다음과 같이 작동합니다:
- 더할숫자라는 빈 배열을 선언합니다.
- 더한숫자 변수를 입력된 숫자로 초기화합니다.
- 제곱의합리스트라는 빈 배열을 선언합니다.
- 더한숫자가 1이 아닌 동안 반복합니다.
- 더한숫자의 각 자리의 숫자에 대해 제곱을 계산하여 더할숫자 배열에 추가합니다.
- 더한숫자는 더할숫자 배열의 합으로 갱신됩니다.
- 더할숫자 배열은 비워집니다.
- 만약 더한숫자가 입력된 숫자와 동일하다면, 이는 무한 루프에 빠진 것으로 판단하여 false를 반환합니다.
- 제곱의합리스트에 더한숫자가 이미 존재한다면, 이는 반복되는 패턴이 발생한 것으로 판단하여 false를 반환합니다.
- 제곱의합리스트에 더한숫자를 추가합니다.
- 반복문을 빠져나왔다면, 1을 반환하여 "행복한 숫자"임을 나타냅니다.
마지막으로, 주어진 testcase 배열을 순회하면서 happyNumber 함수를 호출하여 각 숫자가 "행복한 숫자"인지 판별하고 결과를 출력합니다.
추가로 주어진 test 함수는 forEach를 사용하여 배열의 각 요소를 순회하고, 요소가 10인 경우 false를 반환하며, 그 외의 경우에는 true를 반환하는 간단한 예시 함수입니다