반응형
요약
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 방식은 낯설었는데 이번 기회에 배우는 기회가 되었다.
반응형
'공부 정리 > You Don't Know Js' 카테고리의 다른 글
[YDKJ] Scope & Closures - Illustrating Lexical Scope (0) | 2023.05.08 |
---|---|
[YDKJ] Scope & Closures - What's the Scope? (0) | 2023.05.02 |
[YDKJ] Get Started - Appendix A (0) | 2023.04.27 |
[YDKJ] Get Started - Chapter 4 - 1 (0) | 2023.04.26 |
[YDKJ] Get Started - Chapter 3 - 1 (0) | 2023.04.26 |
댓글