몸과 마음이 건전한 SW 개발자

프로그래머스 [Lv. 2] 아날로그 시계 {언어 : JavaScript} [암기하기] 본문

알고리즘

프로그래머스 [Lv. 2] 아날로그 시계 {언어 : JavaScript} [암기하기]

스위태니 2024. 5. 28. 17:43

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/250135

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

정답 코드

function solution(h1, m1, s1, h2, m2, s2) {
    const getCounts = (h, m, s) => {
        let cntH = h * 60 + m;
        let cntM = h * 59 + m;
        let counts = -1;
        
        if (h >= 12) {
            [cntH, counts] = [cntH-1, counts-1];
        };
        
        const degreeH = (h % 12) * 30 + m * 0.5;
        const degreeM = m * 6;
        const plusH = degreeH <= s * (6 - (1 / 120));
        const plusM = degreeM <= s * 5.9;
        
        cntH = plusH ? cntH + 1 : cntH;
        cntM = plusM ? cntM + 1 : cntM;
        
        counts += cntH + cntM;
        
        return counts;
    };
    const counts = getCounts(h2, m2, s2) - getCounts(h1, m1, s1);
    const answer = s1 == 0 && m1 == 0 ? counts + 1 : counts;
    return answer;
}

풀이 방법

1. getCounts 함수 정의

목적:

주어진 시각까지 조건을 만족하는 시각이 몇 번인지 계산하는 함수이.

설명:

  • 입력: h, m, s (시, 분, 초)
  • 계산 과정:
    1. cntH와 cntM 초기화:
      • cntH = h * 60 + m (시를 분으로 변환 후 분과 합산)
      • cntM = h * 59 + m (시를 59로 곱한 후 분과 합산)
    2. 초기 counts를 -1로 설정
    3. 12시 이상일 경우 cntH와 counts를 1씩 감소
    4. 시침(degreeH)과 분침(degreeM)의 각도를 계산:
      • degreeH = (h % 12) * 30 + m * 0.5
      • degreeM = m * 6
    5. 초침의 각도와 비교하여 cntH와 cntM을 증가:
      • 시침 각도가 s * (6 - (1 / 120))보다 작거나 같으면 plusH는 1
      • 분침 각도가 s * 5.9보다 작거나 같으면 plusM은 1
    6. plusH와 plusM을 더해서 cntH와 cntM을 각각 증가 (true면 1 false는 0)
    7. 최종적으로 cntH와 cntM의 합을 counts에 더해 반환

2. 메인 로직

목적:

주어진 두 시간 사이에 조건을 만족하는 시각의 수를 계산한다.

설명:

  • h1, m1, s1에서 h2, m2, s2까지의 조건 만족 횟수를 계산
  • getCounts 함수를 호출하여 두 시각에 대한 값을 얻음
  • 두 값을 빼서 사이의 조건 만족 횟수를 구함
  • s1과 m1이 모두 0일 경우 결과에 1을 더함 (정확히 h1:m1에서 시작하기 때문)

3. 결과 반환

목적:

최종 계산된 값을 반환한다.

설명:

  • 두 시간 사이에 조건을 만족하는 시각의 수를 반환

느낀점

  • 너무 어렵고 다시 풀어도 틀릴 것 같아서 암기하려고 한다.