한번씩 읽고 가세요.
“ 처음에는 컴퓨터 과학과 이론을 배워라. 그리고는 프로그래밍 스타일을 익혀라. 그리고는 모두 잊어버려라. 그저 해킹하라. ”
- George Carrette
SIOD의 창시자, hack은 개발에 몰두하는 것을 말함
1.
두 날짜(YYYYMMDD)의 차이 일수를 구하는 프로그램을 작성하시오.
※ 단, 프로그래밍 언어에서 지원하는 날짜차이를 계산하는 라이브러리는 사용하지 말것
예)
20070515 sub 20070501 = 14
20070501 sub 20070515 = 14
20070301 sub 20070515 = 75
풀이
function subdate(date){
년 = parseInt(date.slice(0, 4))
월 = parseInt(date.slice(4, 6))
일 = parseInt(date.slice(6))
console.log(년, 월, 일)
월별일 = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
일수 = 년 * 365 + 일
for(let i=1; i<월;i++){
일수 += 월별일[i]
}
return 일수
}
function solution(a, b){
return Math.abs(subdate(a) - subdate(b))
}
solution('20070515', '20070501') //14
solution('20070301', '20070515') //75
- subdate 함수는 날짜를 입력받아 해당 날짜의 년, 월, 일을 추출합니다.
- date.slice(0, 4)를 통해 연도(년)를 추출합니다.
- date.slice(4, 6)를 통해 월(월)을 추출합니다.
- date.slice(6)를 통해 일(일)을 추출합니다.
- console.log를 사용하여 년, 월, 일을 출력합니다.
- 월별일은 각 월에 해당하는 일 수를 저장한 배열입니다.
- 일수 변수를 초기화하고, 년에 365를 곱하고 일을 더합니다.
- for 반복문을 사용하여 1부터 해당 월 전까지의 월별 일 수를 더합니다.
- 최종적으로 일수를 반환합니다.
- solution 함수는 두 개의 날짜 문자열(a와 b)을 입력받아 날짜 차이를 구합니다.
- subdate(a)와 subdate(b)를 호출하여 각 날짜의 일 수를 구합니다.
- Math.abs를 사용하여 두 일 수의 차이의 절댓값을 반환합니다.
따라서, 주어진 두 날짜 사이의 일수 차이가 결과로 출력됩니다. 예시에서는 '20070515'와 '20070501' 사이의 차이인 14, 그리고 '20070301'와 '20070515' 사이의 차이인 75가 결과로 출력됩니다.
2.
== 문제 설명 ==
양의 정수 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])
- happyNumber 함수는 입력으로 주어진 숫자가 행복한 숫자인지를 판별합니다.
- 더할숫자와 더한숫자는 초기화된 빈 배열과 입력 숫자로 설정됩니다.
- 제곱의합리스트는 빈 배열로 초기화됩니다.
- while 반복문은 더한숫자가 '1'이 아닐 때까지 실행됩니다.
- for...of 문을 사용하여 더한숫자의 각 자릿수를 추출합니다.
- 각 자릿수를 제곱하여 더할숫자 배열에 추가합니다.
- 더한숫자는 더할숫자의 합으로 갱신됩니다.
- 더할숫자 배열은 다시 빈 배열로 초기화됩니다.
- 만약 더한숫자가 입력 숫자와 동일하다면, 즉 이전에 등장한 숫자들의 반복이 발생한다면 false를 반환합니다.
- 제곱의합리스트 배열에 더한숫자를 추가합니다.
- while 반복문이 종료되면 true를 반환합니다.
- testcase는 주어진 테스트 케이스 배열입니다.
- for 반복문을 사용하여 각 테스트 케이스에 대해 happyNumber 함수를 호출하여 결과를 출력합니다.
- happyNumber 함수의 반환값에 따라 행복한 숫자인지와 그렇지 않은 숫자인지를 출력합니다.
- Case #${i+1}: ${testcase[i]} is a Happy number. 혹은 Case #${i+1}: ${testcase[i]} is an Unhappy number. 형식으로 출력됩니다.
- test 함수는 주어진 배열에서 값이 10인 경우 false를 반환하고, 그 외의 경우에는 true를 반환하는 예제 함수입니다.
따라서, 주어진 테스트 케이스에 대해 숫자별로 행복한 숫자인지를 출력합니다. testcase 배열의 숫자에 따라 각각 행복한 숫자인지 아닌지가 결과로 출력됩니다.