프로그래머스: 2016 (원하는 날짜 요일구하기) new Date()/getDay/reduce




프로그래머스 ‘2016’ 문제.

원하는 날짜의 요일을 구하는 문제이다

알아두면 좋은 개념은

const now = new Date(2016-04-24)

now	//2016-05-23T15:00:00.000Z
now.getDate();	//24
now.getFullYear();	//2016
now.getMonth() + 1;	//5
now.getDay()	//2	해당요일의 인덱스를 받아옴

typeof new Date() //'object'
typeof Date()	//'string'



나의 해결방안

case1

function solution(a, b) {
     var answer = '';
     const week = ['SUN','MON','TUE','WED','THU','FRI','SAT']
     answer = week[new Date(`2016-${a}-${b}`).getDay()]

     return answer;
}

new Date()getDay 메서드를 이용했다.

new Date 메서드를 날짜로 받고,

getDay는 getDate와는 다르게 요일의 인덱스를 반환해준다. 일요일부터 토요일까지 0 - 6의 숫자로 리턴해준다.

그래서 week라는 배열안에 일-토 까지 선언해준뒤 getDay로 받아온 인덱스값의 숫자를 넣어주면 answer로 리턴해준다





case 2 (for문)

function solution(a, b) {
    //기준점이 되는 날짜에서 며칠이 지났는지를 이용해서 구한다
  const week = ['FRI','SAT','SUN','MON','TUE','WED','THU']
  const month = {
    1: 31,
    2: 29,
    3: 31, 
    4: 30,
    5: 31,
    6: 30,
    7: 31,
    8: 31,
    9: 30,
    10: 31,
    11: 30,
    12: 31
  }
  let answer = 0;
  for(let i = 1; i < a; i++){
    answer += month[i]  //5월이 되기 직전의 날짜를 더한다
  }
  answer += (b-1);  //5월이 지난 이후의 날짜를 더한다
  answer = week[answer % 7]
  return answer;
}

month 객체에 월과 일을 짝지어 선언해준다. 1월은 31일, 2월은 29일… 이런식으로.

그리고 우리가 구하려고 하는건 기준점인 1월 1일 이후부터 구하려고하는 날짜까지 며칠이 지났는지 그 일수를 구해

그 일수를 7로 나눈 나머지가 일주일의 몇번째 인덱스가 되도록 구하면 된다.

처음 for문으로는 5월이 되기 전까지의 1,2,3,4월의 요일을 다 더해서 answer에 더해준다.

month[i] 는 month객체의 [i] 번째 키값을 가져온다고 생각하면 됨

그리고나서는 5월1일부터 현재 날짜까지의 일수를 더해 answer에 누적해준다.

현재날짜의 바로 직전까지 구해야하기 때문에 b-1로 구해준다.

그리고 그 answer를 7로 나눠주고 그 나머지가 week의 인덱스가 된다.


CASE 3 (reduce함수)

function solution(a,b){
  const week = ['FRI','SAT','SUN','MON','TUE','WED','THU']
	const answer = new Array(a).fill(1).reduce((acc,cur,i)=>{
        //a만큼의 길이값
        const monthNum = cur + i;
        //삼항연산자 사용
        //monthNum이 a월과(1,2,3,4)같지 않은 경우
        return acc + (monthNum !== a ? month[monthNum] : b-1);
    },0)
    
    return week[answer % 7];
}




CASE 4

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

사실 이게 내가 푼 방법과 가장 비슷하다.

근데 월을 구하는 getMonth() 메서드는 월을 구할때 +1을 해주기 때문에 매개변수로 넣을때는 -1을 해줘야한다.

CASE 5

function solution(a,b){
  const week = ['SUN','MON','TUE','WED','THU','FRI','SAT']
  
  const days = new Date( `2016-${a}-${b}` ).getDay();
  answer = String(answer).slice(0,3).toUpperCase();
	return answer;
}





© 2018. by sora

Powered by sora