프로그래머스 문제 풀이

[프로그래머스 Lv.1] 2016년 (JS, 특정 날짜로 요일 반환)

MOLLY_ 2024. 10. 4. 19:14
728x90

< 목차 >

0. 문제 설명 및 제한 조건

1. 작성한 답안 코드

2. 풀이 과정

3. AI가 한 리팩토링

4. Date 객체

 

 

0. 문제 설명 및 제한 조건

문제 풀이에 성공할 때마다 느껴지는 짜릿함이 날 미치게 해.

 

 

1. 작성한 답안 코드

function solution(a, b) {
    const date = '2016-0'+ a + '-' + b;
    const week = ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT'];
    
    return week[new Date(date).getDay()];
}

 

 

2. 풀이 과정

문제를 봤을 때, 되게 흥미로웠다. 날짜를 반환하거나 날짜 포맷을 변환하는 것은 보고, 코드를 직접 작성해 본 적도 있었지만 요일 반환은 해본 적이 없기 때문이다. 그래서 어떻게 코드를 작성해야 할지 감이 안 옴과 동시에 재밌을 것 같아서 즉시 구글링을 하여 다음과 같은 자료를 찾았다.

 

특정 날짜가 무슨 요일인지 구하는 함수다.

 

딱 봐도 굉장히 도움이 될 것 같은 느낌이 물씬 풍긴다

 

여러 자료 중에 위 내용이 가장 맘에 들어서 이 함수를 응용하기로 마음먹었다.

 

function getDayOfWeek(날짜문자열){ //ex) getDayOfWeek('2022-06-13')
    const week = ['일', '월', '화', '수', '목', '금', '토'];
    const dayOfWeek = week[new Date(날짜문자열).getDay()];

    return dayOfWeek;
}

출처: [Tistory] 욱드래곤의 우당탕탕 코딩일기 - [Javascript] 특정 날짜가 무슨 요일인지 구하는 함수 (https://wook-dragon.tistory.com/6)

 

그 다음에 내가 생각해야 할 것은 위 "날짜문자열"을 어떻게 매개변수 a, b에 맞게 양식을 바꿀 것인가였다.

 

const date = '2016-0'+ a + '-' + b; // e.g. '2016-05-11'

 

결국, 위처럼 매우 간단하게 형식을 맞췄다.

 

프로그래머스의 모든 테스트 케이스도 통과했다.

하지만, 2016-0에서 0으로 시작하기 때문에 10의 자리 수의 월이 a 자리에 들어오는 테스트 케이스가 있었다면 통과하지 못했을 것이다.

 

그럼 어떻게 코드를 수정해야 할까?

AI에게 리팩토링을 맡겨보면 해답을 찾을 수 있을 것이라 생각했다.

 

 

3. AI가 한 리팩토링

그렇다면, AI가 이 코드를 리팩토링하면 어떻게 될까?

두근두근 매우 궁금해서 바로 물어봤다. 답변은 다음과 같았다.

 

function solution(a, b) {
    const week = ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT'];
    
    // a - 1을 사용하는 이유는 Date 객체의 월이 0부터 시작하기 때문 (인덱스처럼 0부터 시작)
    // 1월은 0, 2월은 1...
    return week[new Date(2016, a - 1, b).getDay()];
}

 

해답 찾았다. 코드도 매우 간결해졌다. 테스트 똑같이 돌려봤는데, 전부 통과했다.

중요한 건, 불필요한 변수 선언이 줄었고 찜찜한 하드 코딩도 사라졌다.

 

테스트 케이스는 통과했지만 찜찜한 코드를 작성했던 건,

Date 객체에 대한 이해가 부족했기 때문이었다. 그래서 Date 객체를 좀 더 알아보기로 했다.

 

 

4. Date 객체

JavaScript의 Date 객체는 날짜와 시간을 다루기 위해 사용한다.

 

1) 생성자

(1) 현재 날짜와 시간을 생성

const now = new Date();

 

 

(2) 특정 날짜를 생성

const specificDate = new Date(2023, 9, 3); // 2023년 10월 3일

 

여기서 내가 몰랐던 부분이 등장한다.

월은 0부터 시작한다는 점이다. 10월은 9로 지정한다.

 


(3) 날짜 문자열을 사용해서 생성

const dateFromString = new Date('2023-10-03');

 

 

2) Date 객체의 메서드

Date 객체를 사용하면 날짜와 시간을 다양한 방식으로 다룰 수 있다.


(1) 년/월/일 가져오기

const year = specificDate.getFullYear(); // 연도
const month = specificDate.getMonth();   // 월 (0부터 시작)
const day = specificDate.getDate();      // 일

 


(2) 요일 가져오기

const dayOfWeek = specificDate.getDay(); // 0: 일요일, 1: 월요일 ...

 

 

(3) 시간 가져오기

const hours = specificDate.getHours();     // 시
const minutes = specificDate.getMinutes(); // 분
const seconds = specificDate.getSeconds(); // 초

 

 

3) 시간 조작

Date 객체는 특정 날짜를 더하거나 빼는 방식으로 시간 조작도 가능하다.

 

다음은 날짜를 설정하는 예시다.

specificDate.setFullYear(2024); // 연도를 2024로 변경
specificDate.setMonth(11);      // 12월로 변경 (0부터 시작)
specificDate.setDate(25);       // 25일로 변경


 

 

4) 유용한 포인트

  • 월은 0부터 11까지이기 때문에, new Date(2023, 9, 3)는 10월 3일을 의미
  • getDay() 메서드는 요일을 0(일요일)부터 6(토요일)까지 반환
  • 날짜/시간의 계산 및 조작은 getTime() 메서드로 밀리초 단위로 변환해서 쉽게 할 수 있음

 

 

728x90