프로그래머스 문제풀기

프로그래머스16탄 -(코딩도장)

Hyeon been 2023. 5. 31. 20:55

한번씩 읽고 가세요.

“ 처음에는 컴퓨터 과학과 이론을 배워라. 그리고는 프로그래밍 스타일을 익혀라. 그리고는 모두 잊어버려라. 그저 해킹하라. ”

- George Carrette
SIOD의 창시자, hack은 개발에 몰두하는 것을 말함
728x90

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
  1. subdate 함수는 날짜를 입력받아 해당 날짜의 년, 월, 일을 추출합니다.
    • date.slice(0, 4)를 통해 연도(년)를 추출합니다.
    • date.slice(4, 6)를 통해 월(월)을 추출합니다.
    • date.slice(6)를 통해 일(일)을 추출합니다.
    • console.log를 사용하여 년, 월, 일을 출력합니다.
    • 월별일은 각 월에 해당하는 일 수를 저장한 배열입니다.
    • 일수 변수를 초기화하고, 년에 365를 곱하고 일을 더합니다.
    • for 반복문을 사용하여 1부터 해당 월 전까지의 월별 일 수를 더합니다.
    • 최종적으로 일수를 반환합니다.
  2. 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.

== 채점 기준 ==

  1. 작성한 프로그램은 각각의 테스트케이스에 대해서 올바른 결과를 출력하여야 한다.
  2. 입력 후 결과 출력까지 걸리는 시간이 빠르면 빠를수록 좋다.

(* 이번 문제는 정확한 결과만큼이나 속도도 중요합니다)

  1. 프로그램에서 사용한 자료구조 및 알고리즘이 적절하여야 한다.
  2. 그 외 일반적인 코드 구조, 스타일, 에러/예외 처리 등이 적절할수록 좋다.

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])
  1. happyNumber 함수는 입력으로 주어진 숫자가 행복한 숫자인지를 판별합니다.
    • 더할숫자와 더한숫자는 초기화된 빈 배열과 입력 숫자로 설정됩니다.
    • 제곱의합리스트는 빈 배열로 초기화됩니다.
    • while 반복문은 더한숫자가 '1'이 아닐 때까지 실행됩니다.
    • for...of 문을 사용하여 더한숫자의 각 자릿수를 추출합니다.
    • 각 자릿수를 제곱하여 더할숫자 배열에 추가합니다.
    • 더한숫자는 더할숫자의 합으로 갱신됩니다.
    • 더할숫자 배열은 다시 빈 배열로 초기화됩니다.
    • 만약 더한숫자가 입력 숫자와 동일하다면, 즉 이전에 등장한 숫자들의 반복이 발생한다면 false를 반환합니다.
    • 제곱의합리스트 배열에 더한숫자를 추가합니다.
    • while 반복문이 종료되면 true를 반환합니다.
  2. testcase는 주어진 테스트 케이스 배열입니다.
  3. for 반복문을 사용하여 각 테스트 케이스에 대해 happyNumber 함수를 호출하여 결과를 출력합니다.
    • happyNumber 함수의 반환값에 따라 행복한 숫자인지와 그렇지 않은 숫자인지를 출력합니다.
    • Case #${i+1}: ${testcase[i]} is a Happy number. 혹은 Case #${i+1}: ${testcase[i]} is an Unhappy number. 형식으로 출력됩니다.
  4. test 함수는 주어진 배열에서 값이 10인 경우 false를 반환하고, 그 외의 경우에는 true를 반환하는 예제 함수입니다.

따라서, 주어진 테스트 케이스에 대해 숫자별로 행복한 숫자인지를 출력합니다. testcase 배열의 숫자에 따라 각각 행복한 숫자인지 아닌지가 결과로 출력됩니다.