181206 TIL Lec4 array parser step7 && 미니 세미나 && 알고리즘

» 1막, TIL (Today I Learned), 코드스쿼드

Lec4 array parser step7

  • 테스트코드를 짜면서 실력의 부족함을 엄청 느꼈다.

image

여기서 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을 날릴 수 있었다.

image

과연 머지가 될 것인가!?


미니 세미나

오늘은 프론트엔드 미니 세미나를 하는 날이었다. 한 2주 전부터 팀을 짰고 준비를 했다. 헤드와 팀이었고 주제는 요새 핫하다는 “Chrome Extension 만들기”이다.

발표자료

생각보다 만드는 게 어렵지 않고 배운걸 활용해 볼 수 있을 것 같아서 조만간 한번 만들어보면 좋을 것 같다. 다음 방학 프로젝트로 해야하나..

다른 팀 주제

  • three.js (리오 & 비센스)
  • AMP (우기 & 토마스)
  • GraphQL (반 & 웨일)
  • 웹 컴포넌트 (토르코 & 달리)
  • 함수형 기법 겉핥기 (새로 & 솔로몬)
  • 크롬 익스텐션 (숨 & 헤드)
  • SNS & UX (코코아 & 카카)

다 한번쯤 공부해보면 좋을 주제들이다.

알고리즘

하아……. 이번 알고리즘 문제는 어려워도 너무 어렵다…..

오늘 특히나 세미나 하면서 기운이 다 빠져서… 더 힘들었다. 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))