181206 TIL Lec4 array parser step7 && 미니 세미나 && 알고리즘
Dec 6, 2018
»
1막,
TIL (Today I Learned),
코드스쿼드
Lec4 array parser step7
- 테스트코드를 짜면서 실력의 부족함을 엄청 느꼈다.
여기서 expect함수를 전혀 짤 수가 없었다… 이틀 전에 이 부분 짜면서 정말 멘탈 바사삭 되서 울기 직전이었는데 ㅋㅋ 어려워서 힘들었다기 보단 왜 나 이것도 모르지 하는 자괴감… 다행히 헤드가 옆에서 차근차근 도와주는 덕분에 포기하지 않고 풀 수 있었다…
- 기존의 scan 함수는 덩어리가 너무 커서 테스트 하는 데 어려움이 있었다.
function scan(str) {
let tokens = [];
let stack = "";
let stringOpened = false;
for (let token of str) {
if (token === '[' && stringOpened === false || token === '{' && stringOpened === false) {
stack === "" ? tokens.push(token) : tokens.push(stack);
stack = "";
} else if (token === "'") {
stack += token;
if (stringOpened === true) stringOpened = false;
else if (stringOpened === false) stringOpened = true;
} else if (token === ',' && stringOpened === false) {
if (stack !== "") {
tokens.push(stack)
};
stack = "";
} else if (token === ']' && stringOpened === false || token === '}' && stringOpened === false || token === ':') {
if (stack !== "") {
tokens.push(stack)
};
tokens.push(token);
stack = "";
} else if (token === ' ') {
continue;
} else {
stack += token;
}
}
return tokens;
}
- 이번엔 비센스의 도움을 받아 클래스로 바꿨다. 중복되는 것은 최대한 없애는 것이 포인트!
class Scan {
constructor() {
this.tokens = [];
this.stack = "";
this.stringOpened = false;
this.tokenMap = {
end: ["]", "}"],
dividingPoints: ["[", "]", "{", "}", ":", ","]
}
}
tokenize(str) {
for (let token of str) {
if (token === " ") {continue;}
if (!this.stringOpened && this.tokenMap.dividingPoints.includes(token)) {
this.isDivididingPoints(this.tokens, token, this.stack, this.stringOpened);
} else if (token === "'") {
this.stack += token;
this.stringOpened = (this.stringOpened) ? false : true;
} else if (!this.tokenMap.dividingPoints.includes(token) || this.stringOpened) {
this.stack += token;
}
}
return this.tokens;
};
isDivididingPoints(tokens, token, stack, stringOpened) {
this.setTokens(tokens, token, stack);
this.stack = "";
if (!stringOpened && this.tokenMap.end.includes(token) || token === ':') {
tokens.push(token);
}
}
setTokens(tokens, token, stack) {
stack.length ? tokens.push(stack) : tokens.push(token);
return tokens;
};
}
module.exports = Scan
생각보다 오래 수정을 한 뒤 PR을 날릴 수 있었다.
과연 머지가 될 것인가!?
미니 세미나
오늘은 프론트엔드 미니 세미나를 하는 날이었다. 한 2주 전부터 팀을 짰고 준비를 했다. 헤드와 팀이었고 주제는 요새 핫하다는 “Chrome Extension 만들기”이다.
발표자료
생각보다 만드는 게 어렵지 않고 배운걸 활용해 볼 수 있을 것 같아서 조만간 한번 만들어보면 좋을 것 같다. 다음 방학 프로젝트로 해야하나..
다른 팀 주제
- three.js (리오 & 비센스)
- AMP (우기 & 토마스)
- GraphQL (반 & 웨일)
- 웹 컴포넌트 (토르코 & 달리)
- 함수형 기법 겉핥기 (새로 & 솔로몬)
- 크롬 익스텐션 (숨 & 헤드)
- SNS & UX (코코아 & 카카)
다 한번쯤 공부해보면 좋을 주제들이다.
알고리즘
하아……. 이번 알고리즘 문제는 어려워도 너무 어렵다…..
-
해커랭크 sort #3 - Fraudulent Activity Notifications
-
해커랭크 sort #4 - Merge Sort: Counting Inversions
오늘 특히나 세미나 하면서 기운이 다 빠져서… 더 힘들었다. 4번은 해볼 엄두도 안났고 3번을 겨우 했는데! 시간 복잡도에서 탈락 ㅋ
function solution (expenditure, d){
let result = {};
let notification = 0;
let len = expenditure.length % 2 ? expenditure.length-d+1 : expenditure.length-d;
// d 갯수만큼 배열 뽑아 result 객체에 넣기
for (let i = 0; i < len; i++){
let arr = [];
for (let j = i; j < i+d; j++){
arr.push(expenditure[j])
}
result[i] = arr;
}
// result 객체 돌면서 sort후 median*2해서 객체에 넣기
for (let value in result){
result[value] = result[value].sort();
result[value].doubledMedian = getMedian(result[value])*2
}
// notification 여부 확인
for (let i = 0; i < len; i++){
if(result[i].doubledMedian <= expenditure[d+i]) notification++;
}
return notification;
}
function getMedian(arr){
const len = arr.length;
if (len%2) return arr[Math.floor(len/2)];
return (arr[Math.floor(len/2)]+arr[Math.ceil(len/2)])/2
}
console.log(solution([10,20,30,40,50],3))