JS, 프로그래머스 - 2016
문제를 풀면서 메서드를 이용하여 간단하게 푸는것이 오히려 독이 될 수 있음을 깨달아 블로그 글 갱신
https://school.programmers.co.kr/learn/courses/30/lessons/12901#
문제는
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 객체를 사용한 두 번째 방식은 코드가 간결하지만, 효율성 면에서 첫 번째 방식에 비해 성능이 떨어짐 코드 작성 시 간결함도 중요하지만, 효율성 또한 고려해야 하는 부분(개인적으로 효율성을 더 우선순위에 두는 편) 최적의 해결 방법을 찾기 위해 다양한 접근 방식을 고민하는 것이 중요하다고 생각이 듬 이를 통해 문제 해결 능력을 향상시키고, 더 나은 성능과 가독성을 가진 코드를 작성하는 데 도움이 될 것이라 생각함 프로그래밍은 단순히 작동하는 코드를 작성하는 것뿐만 아니라, 다양한 제약 조건 속에서 최적의 해결책을 찾는 과정인것 같음 각 상황에 맞는 적절한 방법을 선택하는 것이 중요하며, 이를 위해 항상 여러 방식을 시도하고 비교하는 습관을 가져야 겠음