TIL. 알고리즘. 항해의 종착일<22.03.17>

항해의 종착일 구하기

function solution(month, day) {
  let answer = 0;
  
  let arr = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
  
  for (let i = month-1; i <= arr.length; i++) { 
    answer += arr[i];			// 98일이 지나는 동안의 달 수를 더해줍니다.
    if (answer >= day+98) {
      answer -=arr[i]			//아래의 계산식을 위해 막 달을 뺐습니다.
      month = i+1;
      day = answer-day+98		//이해하시는데 어려움이 많은 부분입니다. 주석으로 처리하기 길어서 아래의 글로 적습니다.
      return `${month}월 ${day}일`
    }
    if (i == 11) {
      i = -1;				// 12월에 시작하면 1월로 돌아가게 했습니다.
    }
  }
}

console.log(solution(1, 1))

99일동안의 항해를 몇월 몇일에 시작했으면 언제 끝나는지 알려주는 자바스크립트 코드입니다.

사실 이 코드는 다른분이 쓰신 코드를 가져와 수정한 것입니다. 하지만 달 수를 미리 계산하는 부분이 이해가 안되어 98일이 지나는 일을 세세히 나눠서 이해했고 그에 따라 수정이 불가피 했습니다. 요지는 이렇습니다.

만약 1월 1일에 항해를 시작하였으면 1월 한달동안 남은 날수는 '31일 - 1일 = 30일' 입니다. 그러면 '98일 - 30일 = 68일'이 남게되겠지요. 남은 일은 빠르게 달 수로 지나가게 합니다. 1월의 다음달은 2월이니 '68일 - 28일 = 40일' 그리고 3월이니 '40일 - 31일 = 9일' 입니다.

이 남은 9일은 4월의 9일이 되겠지요? 그러면 계산이 끝났네요? 답은 '4월 9일'이 됩니다. 다시 코드로 돌아가 보면 day를 구하는 식을 왜 저렇게 썼는지, answer -=arr[i]를 굳이 왜 넣었는지 이해가 가실 것 입니다.

주요 메서드

사실 주요 메서드가 없다는게 이 코드의 특징입니다. date 메서드를 안쓰고 코드를 짜는 연습을 해봤습니다.

while을 이용한 다른풀이 방식

function solution(month, day){
  let result=""
  let days = 0
  date = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
  month -= 1
  while(days + date[month] < 98) {
    days += date[month++]
    month > 11 ? month = 0 : {}
  }
  day += 98-days
  if(date[month] < day)
    day -= date[(month++)]
  result = (month+1) + '월 ' + day + '일'
   return result;
}
console.log(solution(1,18))

좋은 웹페이지 즐겨찾기