본문 바로가기
공부 정리/You Don't Know Js

[YDKJ] Get Started - Appendix B

by 경적필패. 2023. 4. 30.
반응형

요약

Practicing Comparisons

scheduleMeeting(..) 함수는 시작 시간 (24 시간 형식의 문자열 "hh:mm")과 미팅 기간 (분 단위)을 받습니다. dayStart 및 dayEnd에서 지정된 시간에 따라 미팅이 전적으로 업무 일정 내에 있는 경우 true를 반환하고 업무 일정 범위를 위반하는 경우 false를 반환합니다.

내코드

const dayStart = "07:30";
const dayEnd = " 17:45";

const [sh, sm] = dayStart.split(":");
const [eh, em] = dayEnd.split(":");
let startSum = parseInt(sh) * 60 + parseInt(sm);
let endSum = parseInt(eh) * 60 + parseInt(em);
console.log(startSum, endSum)
const scheduleMeeting = (dayStart, durationMinutes) => {
	const [sh, sm] = dayStart.split(":");
	const sum = parseInt(sh) * 60 + parseInt(sm);
	if (sum < startSum) return false;
	if (sum + durationMinutes <= endSum) return true;
	return false;
}
console.log(scheduleMeeting("7:00", 15));
console.log(scheduleMeeting("07:15", 30));
console.log(scheduleMeeting("7:30", 30));
console.log(scheduleMeeting("11:30", 60));
console.log(scheduleMeeting("17:00", 45));
console.log(scheduleMeeting("17:30", 30));
console.log(scheduleMeeting("18:00", 15));

알고리즘 문제 푸는 느낌으로 코드를 짰다.

 

 

const dayStart = "07:30";
const dayEnd = "17:45";

function scheduleMeeting(startTime,durationMinutes) {
    var [ , meetingStartHour, meetingStartMinutes ] =
        startTime.match(/^(\d{1,2}):(\d{2})$/) || [];

    durationMinutes = Number(durationMinutes);

    if (
        typeof meetingStartHour == "string" &&
        typeof meetingStartMinutes == "string"
    ) {
        let durationHours =
            Math.floor(durationMinutes / 60);
        durationMinutes =
            durationMinutes - (durationHours * 60);
        let meetingEndHour =
            Number(meetingStartHour) + durationHours;
        let meetingEndMinutes =
            Number(meetingStartMinutes) +
            durationMinutes;

        if (meetingEndMinutes >= 60) {
            meetingEndHour = meetingEndHour + 1;
            meetingEndMinutes =
                meetingEndMinutes - 60;
        }

        // re-compose fully-qualified time strings
        // (to make comparison easier)
        let meetingStart = `${
            meetingStartHour.padStart(2,"0")
        }:${
            meetingStartMinutes.padStart(2,"0")
        }`;
        let meetingEnd = `${
            String(meetingEndHour).padStart(2,"0")
        }:${
            String(meetingEndMinutes).padStart(2,"0")
        }`;

        // NOTE: since expressions are all strings,
        // comparisons here are alphabetic, but it's
        // safe here since they're fully qualified
        // time strings (ie, "07:15" < "07:30")
        return (
            meetingStart >= dayStart &&
            meetingEnd <= dayEnd
        );
    }

    return false;
}

scheduleMeeting("7:00",15);     // false
scheduleMeeting("07:15",30);    // false
scheduleMeeting("7:30",30);     // true
scheduleMeeting("11:30",60);    // true
scheduleMeeting("17:00",45);    // true
scheduleMeeting("17:30",30);    // false
scheduleMeeting("18:00",15);    // false

 

이건 저자의 코드인데,

1. 나와 다른 점은 정규표현식을 이용해 시간을 뽑아냄.

2. parseInt대신 Number 사용, => parseInt는 정수 + 진법변환, Number는 그냥 문자열을 숫자로.

3. padStart를 이용해 시간포멧을 맞춤 => 이번에 처음 알았는데, 유용할 것 같다.

Practicing Closure

const range = (start, end) => {
  const getRange = (start, end) => {
    let result = [];
    for (let i = start; i <= end; i++){
      result.push(i);
    }
    return result;
  }
  if (end === undefined) {
    return  getEnd = (end) => {
      return getRange(start, end);
    };
  }
  else {
    return getRange(start, end);
  }
}
let a = range(3);
a(10) //[3,4,5,6,7,8,9,10]

저자의 코드와 크게 다른 것은 없었다.

end값이 주어지지 않을때는 클로저의 속성을 이용해서 외부 스코프의 변수를 저장해서 계속 사용한다.

 

 

Practicing Prototypes

function randMax(max) {
  return Math.trunc(1E9 * Math.random()) % max;
}

var reel = {
  symbols: [
      "♠", "♥", "♦", "♣", "☺", "★", "☾", "☀"
  ],
  spin() {
      if (this.position == null) {
          this.position = randMax(
              this.symbols.length - 1
          );
      }
      this.position = (
          this.position + 100 + randMax(100)
      ) % this.symbols.length;
  },
  display() {
      if (this.position == null) {
          this.position = randMax(
              this.symbols.length - 1
          );
      }
      return this.symbols[this.position];
  }
};

var slotMachine = {
  reels: [
      // 이 슬롯 머신에는 3 개의 별개의 릴이 필요합니다.
      // 힌트: Object.create (..)
    Object.create(reel),
    Object.create(reel),
    Object.create(reel)
  ],
  spin() {
      this.reels.forEach(function spinReel(reel){
          reel.spin();
      });
  },
  display() {
      // TODO
      var lines = [];

      // display all 3 lines on the slot machine
      for (
          let linePos = -1; linePos <= 1; linePos++
      ) {
          let line = this.reels.map(
              function getSlot(reel){
                  var slot = Object.create(reel);
                  slot.position = (
                      reel.symbols.length +
                      reel.position +
                      linePos
                  ) % reel.symbols.length;
                  return slot.display();
              }
        );
          lines.push(line.join(" | "));
      }

      return lines.join("\n");
  }
};

slotMachine.spin();
slotMachine.display();
// ☾ | ☀ | ★
// ☀ | ♠ | ☾
// ♠ | ♥ | ☀

slotMachine.spin();
slotMachine.display();
// ♦ | ♠ | ♣
// ♣ | ♥ | ☺
// ☺ | ♦ | ★

reel객체를 만든 다음, Object.create()를 통하여 각각 만들어준 후 관리해주는 방식이다.

 

 

 

 

 

느낀 점

직접 클로저를 사용하여 구현해보니 더 와닿는 느낌이든다.

또한 object.create 방식은 낯설었는데 이번 기회에 배우는 기회가 되었다.

 

 

 

반응형

댓글