JS/코테

JS, 프로그래머스 - 2016

Hyeon_E 2024. 5. 21. 20:36

문제를 풀면서 메서드를 이용하여 간단하게 푸는것이 오히려 독이 될 수 있음을 깨달아 블로그 글 갱신

 

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

 

프로그래머스

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

programmers.co.kr

 

문제는

2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? 두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요.

 

로 문제는 배열과 패턴을 파악하여 금방 풀수 있었음

 

function solution(a, b) {
    let weeks = ['FRI','SAT','SUN','MON','TUE','WED','THU']
    let months = [31,29,31,30,31,30,31,31,30,31,30,31]
    let day = b - 1

    for(let i=0; i<a-1; i++) day += months[i] 

    return weeks[day % 7]
}

 

2016년 1월 1일이 금요일이기때문에 인덱스 0을 'FRI'로 시작하도록 하고 윤년이기 때문에 2월을 29일로 배열을 만들어줌 날짜를 더하고 나머지 연산으로 요일을 구함 인덱스는 0부터 시작하므로 0을 맞추기 위해 a와 b는 각 -1로 수 조정

 

조금 더 간단한 방법이 없을까 생각하다가 푼 두번째 방법은

function solution(a, b) {
    const date = new Date(2016, a-1, b).toString()
    
    return date.slice(0,3).toUpperCase()
}

 

반복문이나 배열 없이 Date 객체를 사용해 해당 날짜의 요일을 찾음

Date객체는 (년,월,일,시,분)을 받아 해당날짜를 생성하고 아무것도 넣지 않으면 현재 날짜 및 시간으로 만들어짐

 

Date 객체를 자세히 알아보자면

Date 객체는 다양한 방법으로 날짜를 생성할 수 있음

const date1 = new Date(); // 현재 날짜 및 시간
const date2 = new Date(1991,11,25,3,50); // 1991년 12월 25일 3:50:00 (월 +1 주의)
const date3 = new Date('2014-6-4'); // 2002년 1월 1일 09:00:00
const date4 = new Date('2012-05-17 10:20:30'); // 2012년 5월 17일 10:20:30

 

 

또한 Date 객체에서 다양한 메서드를 이용해 필요한 부분만 뽑아서 사용할 수 있음

함수명 의미 설명
getFullYear() setFullYear() 년도  
getMonth() setMonth() 0~11 > 1월~12월
getDate() setDate()  
getDay() setDay() 요일 0~6 > 일요일 ~ 토요일
getHours() setHours() 시간  
getMinutes() setMinutes()  
getMilliseconds() setMilliseconds() 밀리초  
getSeconds() setSeconds()  
getTime() setTime() Unix 타임 1970/1/1 12:00 기준 경과한 밀리 초

 

날짜를 문자열로 변환하는 방법도 여러가지가 있음

함수명 설명
toString() Thu May 17 2018 17:15:11 GMT+0900 (대한민국 표준시)
toDateString() Thu May 17 2018
toLocaleString() 2018. 5. 17. 오후 5:15:11
toLocaleDateString() 2018. 5. 17.

 

문제에서는 문자로 된 요일을 구하는 문제였기 때문에 Date객체를 문자열로 변환한다음 원하는 요일 부분만 짜르고 대문자로 변경해줌

 

코드가 적고 반복문이나 배열 없이 다른 년도여도 문제가 푸는데 문제가 없는 두번째 방식이 더 좋은 방식처럼 보이지만 놀랍게도 효율차이에서 큰 차이를 보임

 

첫번째 방식은 문제를 테스트 최소시간이 0.04인데 비해 두번째 방식은 0.24이며 제일 오래 시간이 걸린 테스트는 145.13임 첫번째 방법은 최대 11번 반복하며 계산은 단순한 산술 연산으로 매우 빠르지만 두 번째 방법은 Date 객체 생성, 문자열 변환, 자르기, 대문자 변환 등 여러 메서드를 사용하고, Date 객체 생성 자체가 기본적인 산술 연산보다 계산 비용이 큼(날짜를 파싱하고 정규화 하는 등의 내부 작업이 포함되기 때문)

 

😉🤔

더 간단하고 쉬운 방법이 항상 더 효율적인 것은 아니라는것을 깨달음 Date 객체를 사용한 두 번째 방식은 코드가 간결하지만, 효율성 면에서 첫 번째 방식에 비해 성능이 떨어짐 코드 작성 시 간결함도 중요하지만, 효율성 또한 고려해야 하는 부분(개인적으로 효율성을 더 우선순위에 두는 편) 최적의 해결 방법을 찾기 위해 다양한 접근 방식을 고민하는 것이 중요하다고 생각이 듬 이를 통해 문제 해결 능력을 향상시키고, 더 나은 성능과 가독성을 가진 코드를 작성하는 데 도움이 될 것이라 생각함 프로그래밍은 단순히 작동하는 코드를 작성하는 것뿐만 아니라, 다양한 제약 조건 속에서 최적의 해결책을 찾는 과정인것 같음 각 상황에 맞는 적절한 방법을 선택하는 것이 중요하며, 이를 위해 항상 여러 방식을 시도하고 비교하는 습관을 가져야 겠음