2016λ…„

문제 πŸ“–

2016λ…„ 1μ›” 1일은 κΈˆμš”μΌμž…λ‹ˆλ‹€. 2016λ…„ aμ›” b일은 무슨 μš”μΌμΌκΉŒμš”? 두 수 a ,bλ₯Ό μž…λ ₯λ°›μ•„ 2016λ…„ aμ›” b일이 무슨 μš”μΌμΈμ§€ λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜, solution을 μ™„μ„±ν•˜μ„Έμš”. μš”μΌμ˜ 이름은 μΌμš”μΌλΆ€ν„° ν† μš”μΌκΉŒμ§€ 각각 SUN,MON,TUE,WED,THU,FRI,SAT

μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ a=5, b=24라면 5μ›” 24일은 ν™”μš”μΌμ΄λ―€λ‘œ λ¬Έμžμ—΄ β€œTUE”λ₯Ό λ°˜ν™˜ν•˜μ„Έμš”.

  • 2016년은 μœ€λ…„μž…λ‹ˆλ‹€.
  • 2016λ…„ aμ›” b일은 μ‹€μ œλ‘œ μžˆλŠ” λ‚ μž…λ‹ˆλ‹€. (13μ›” 26μΌμ΄λ‚˜ 2μ›” 45일같은 λ‚ μ§œλŠ” 주어지지 μ•ŠμŠ΅λ‹ˆλ‹€)

λ‚˜μ˜ 풀이 πŸ™‹β€β™€οΈ

function solution(a, b) {
  const dayOfTheWeek = ["FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU"];
  const daysOfMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
  let sum = 0;

  if (a === 1) {
    sum = b;
  } else {
    for (let i = 0; i <= a - 2; i++) {
      // 1
      sum += daysOfMonth[i];
      if (i == a - 2) {
        sum += b; //2
      }
    }
  }

  const index = sum - Math.floor(sum / 7) * 7; // 3

  return index === 0 ? dayOfTheWeek[6] : dayOfTheWeek[index - 1];
}

λ‚΄κ°€ μƒκ°ν•œ ν’€μ΄μ˜ μˆœμ„œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

  1. 주어진 μ›”(a)μ „μ˜ 총 λ‚ μ§œλ₯Ό λ”ν•œ 값을 κ΅¬ν•œλ‹€.. = sum
  2. sum에 bλ₯Ό 더해 ν•„μš”ν•œ λ‚ μ§œλ₯Ό λͺ¨λ‘ λ”ν•œ 값을 κ΅¬ν•œλ‹€.
  3. sum에 7의 배수λ₯Ό 뺐을 λ•Œ λ‚˜μ˜¬ 수 μžˆλŠ” ν•œμžλ¦¬ 수λ₯Ό ꡬ해 dayOfTheWeek의 인덱슀둜 ν™œμš©ν•œλ‹€.

trouble shooting 1 πŸ’₯

처음 μ½”λ“œ

for (let i = 0; i <= a - 2; i++) {
  sum += daysOfMonth[i];
  if (i == a - 2) {
    sum += b;
  }
}

μˆ˜μ •ν•œ μ½”λ“œ

if (a === 1) {
  sum = b;
} else {
  for (let i = 0; i <= a - 2; i++) {
    sum += daysOfMonth[i];
    if (i == a - 2) {
      sum += b; //2
    }
  }
}

이 뢀뢄은 μ™œ ν†΅κ³Όν•˜μ§€ λͺ»ν–ˆλŠ”지 머리λ₯Ό ꡴리닀 1월인 경우, 2월인 경우 값을 λŒ€μž…ν•΄μ„œ μƒκ°ν•΄λ³΄λ‹ˆ λ¬Έμ œμ μ„ 찾을 수 μžˆμ—ˆλ‹€.

λ§Œμ•½ 1월이라면 aλŠ” 1μ΄λ˜λŠ”λ° for문의 쑰건에 μ²˜μŒλΆ€ν„° μΆ©μ‘±λ˜μ§€ λͺ»ν•΄μ„œ sum에 값이 듀어가지 μ•Šμ•˜λ˜ 것이닀.

if문으둜 쑰건을 달아주긴 ν–ˆμ§€λ§Œ 쑰건문속 λ°˜λ³΅λ¬Έμ† 쑰건문.. 정말 λ§˜μ— 듀지 μ•ŠλŠ”λ‹€..

trouble shooting 2 πŸ’₯

처음 μ½”λ“œ

return dayOfTheWeek[index - 1];

μˆ˜μ •ν•œ μ½”λ“œ

return index === 0 ? dayOfTheWeek[6] : dayOfTheWeek[index - 1];

κ³„μ‚°λŒ€λ‘œ ν•˜λ©΄ λͺ¨λ“  μΌ€μ΄μŠ€κ°€ ν†΅κ³Όν•΄μ•Όν•˜λŠ”λ° 13개의 μΌ€μ΄μŠ€ 쀑 2κ°œκ°€ ν†΅κ³Όν•˜μ§€ λͺ»ν•˜κ³  계속 μ‹€νŒ¨λ‘œ κ±Έλ Έλ‹€.

ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— λ‚ μ§œλ₯Ό ν•˜λ‚˜ ν•˜λ‚˜ μΆ”κ°€ν•΄μ„œ κ²°κ³Όλ₯Ό ν™•μΈν•˜λ˜ 쀑 이유λ₯Ό μ•Œ 수 μžˆμ—ˆλ‹€.

indexκ°€ 0이 될 μˆ˜λ„ μžˆμ—ˆλ˜κ²ƒμ΄μ—ˆλ‹€.

예λ₯Ό λ“€μ–΄ 5μ›” 5일인 경우, indexκ°€ 126 - (18*7) = 0이 λ˜λŠ”λ° λ‚˜λŠ” 결과값을 dayOfTheWeek[index-1]둜만 λ¦¬ν„΄ν•΄μ„œ κ²°κ³Όκ°€ undefinedκ°€ λ‚˜μ™”λ˜ 것이닀.

returnν•  λ•Œ μ‚Όν•­μ—°μ‚°μžλ₯Ό μ΄μš©ν•΄ indexκ°€ 0이 될 경우의 μΌ€μ΄μŠ€λ„ μ²˜λ¦¬ν•΄μ£Όμ—ˆλ‹€.

Best Practice #1 πŸ‘

function getDayName(a, b) {
  var tempDate = new Date(2016, a - 1, b);

  return tempDate.toString().slice(0, 3).toUpperCase();
}

//μ•„λž˜ μ½”λ“œλŠ” ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•œ μ½”λ“œμž…λ‹ˆλ‹€.
console.log(getDayName(5, 24));

Dateκ°€ μžˆλŠ” κ±Έ μ•ŒκΈ΄ ν–ˆμ§€λ§Œ 그러면 λ„ˆλ¬΄ λ‹¨μˆœν•΄μ§ˆκ²ƒκ°™μ•„μ„œ μ‚¬μš©ν•˜μ§€ μ•Šμ•˜λ‹€.

κ·Έλž˜λ„ λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•œκ±Έ λ³΄λ‹ˆ 훨씬 보기 νŽΈν•˜λ‹€.

Best Practice #2 πŸ‘

function solution(a, b) {
  const monthDay = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
  const weekDay = ["THU", "FRI", "SAT", "SUN", "MON", "TUE", "WED"];

  let days = b;
  for (let i = 0; i < a - 1; i++) days += monthDay[i];

  return weekDay[days % 7];
}

μ½”λ“œκ°€ ν˜λŸ¬κ°€λŠ” ꡬ성이 λ‚΄κ°€ μž‘μ„±ν•œ μ½”λ“œμ™€ 크게 λ‹€λ₯΄μ§€ μ•Šλ‹€.

ν•˜μ§€λ§Œ 간결함과 가독성이 크게 λ‹€λ₯΄λ‹€.

for문의 μ‘°κ±΄μ‹μ—μ„œ <=을 <둜 고쳀을뿐인데 if문이 ν•˜λ‚˜ μ€„μ—ˆλ‹€.

ꡳ이 sumμ΄λΌλŠ” λ³€μˆ˜λ₯Ό μƒˆλ‘œ λ§Œλ“€μ§€ μ•Šκ³  b에 값을 λ”ν•΄μ£Όμ—ˆλ‹€.

ꡳ이… Math.floor()λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³ λ„ κ·Έλƒ₯ %μ—°μ‚°μžλ‘œ λ‚˜λ¨Έμ§€κ°’ κ³„μ‚°ν•΄μ„œ index둜 μ²˜λ¦¬ν•΄μ£Όμ—ˆλ‹€β€¦

λ§Œμ•½ λ‹€λ₯Έ μ‚¬λžŒμ΄ ν‘Ό 닡에 Best Practiceκ°€ μžˆλ‹€λ©΄ λ°°μ—΄ λ‚΄μž₯ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν–ˆμ„ 것이라고 μƒκ°ν–ˆλŠ”λ° μ•„λ‹ˆμ—ˆλ‹€.

λ¬Όλ‘  λ°°μ—΄ λ‚΄μž₯ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  μˆ˜λ„ μžˆμ§€λ§Œ 이 μ½”λ“œκ°€ 가독성도 μ’‹κ³  제일 μ’‹μ•„λ³΄μ˜€λ‹€.

Leave a comment