181026 TIL Lec3 할일관리 step4 & 페어프로그래밍(로또생성기)

» 1막, TIL (Today I Learned)

Daily Plan

  • [10:20 - 10:40] 스크럼 - 어제 TIL 작성
  • [10:50 - 12:30] 클래스 공부
  • [14:00 - 15:00] 알고리즘 수업
  • [15:00 - 17:00] 로또생성기 완성
  • [19:00 - 22:00] 중국어 & 영어 언어교환
  • [23:00 - 24:00] step4 PR


알고리즘 강의


로또생성기

class Lottos {
    constructor() {
        this.list = [];
        this.counter = [];
        this.answer = [];
        this.matchingNumber = {};
    }
    setLuckyNumber(answer) {
        this.answer = answer;
    }
    makeLottoList(money) {
        if (!this.answer.slice(-1).pop()) return console.log("당첨 번호가 설정되지 않았습니다.");
        const lottosNumber = money / 1000
        for (let i = 0; i < lottosNumber; i++) {
            let lotto = [];
            this.list.push(this.makeRandomNumber(lotto));
        }
        this.countMatching(this.list, money);
        // 금액 / 1000
    }
    makeRandomNumber(lotto) {
        for (let j = 0; j < 6; j++) {
            let number = Math.floor(Math.random() * (45 - 1)) + 1;
            while(this.checkSameNumber(number, lotto)){
                number = Math.floor(Math.random() * (45 - 1)) + 1;
            };
            lotto.push(number);
        }
        return lotto;
        
        // 6개의 랜덤 넘버 생성
        // 1 - 45
        // list에 push
    }
    checkSameNumber(number, lotto){
        if(lotto.includes(number)){
            return true;
        }
    }
    
    countMatching(lottosList, money) {
        let counter = 0;
        lottosList.forEach((lotto, index) => {
            counter = this.countSameNumber(lotto);
            this.matchingNumber[index] = counter;
        });
        let reward = this.calculateEarning(this.matchingNumber);
        let earningsRate = this.calculateEarningsRate(reward, money);
        let countSameEarning = this.countSameEarning(this.matchingNumber);
        this.print(earningsRate, countSameEarning);
        // List의 인덱스별 일치 갯수를 counter에 저장
    }
    countSameNumber(lotto) {
        let counter = 0;
        lotto.filter(value => this.answer.includes(value)).forEach(v => counter++);
        return counter;
        // 일치 갯수 카운트
    }
    countSameEarning(matchingNumber) {
        let obj = {
            "0": 0,
            "1": 0,
            "2": 0,
            "3": 0,
            "4": 0,
            "5": 0,
            "6": 0
        };
        for (let value in matchingNumber) {
            obj[matchingNumber[value]]++;
        }
        return obj;
    }
    calculateEarning(matchingNumber) {
        let rewardList = {
            "3": 5000,
            "4": 50000,
            "5": 1500000,
            "6": 2000000000
        };
        let reward = 0;
        for (let value in matchingNumber) {
            if (rewardList[matchingNumber[value]])
                reward += rewardList[matchingNumber[value]];
        }
        return reward;
        // 총 얻은 금액
    }
    calculateEarningsRate(reward, money) {
        return (reward / money) * 100;
        //  얻은 금액 / 내 돈 * 100
    }
    print(earningsRate, countSameEarning) {
        console.log(
            ` 
3개 일치 (5000원)- ${countSameEarning[3]}개
4개 일치 (50000원)- ${countSameEarning[4]}개
5개 일치 (1500000원)- ${countSameEarning[5]}개
6개 일치 (2000000000원)- ${countSameEarning[6]}개
나의 수익률은 ${earningsRate.toFixed(3)}%입니다.
        `
        );
    }
}
const lottos = new Lottos();
lottos.setLuckyNumber([1, 2, 3, 4, 5, 6]);
lottos.makeLottoList(14000);

lec3 - step4

  • 클래스의 역할이 무엇인지 고민하고 여러 동료들에게 물어보았다.
    결론! 클래스를 쓰면 같은 참조를 사용하므로 메모리를 효율적으로 활용할 수 있기 때문에, 똑같은 객체를 찍어낼 때나 메소드를 공유할 때 사용하면 좋다.

  • 원래 짰던 코드에서 할 일 관리는 1. todo 2. history 3. errorCheck 4. show로 나뉘어져 있는데, 이 네 부분을 다 클래스로 바꾸려다가 그렇게 하는 건 클래스를 제대로 활용하는 의미가 없을 거 같았다.

  • 그래서 객체를 찍어내는 task 받는 부분만 클래스로 만들면 좋을 것 같았다.

class Task {
    constructor(name, tag, id, status){
            this.name = name;
            this.tag = tag || '';
            this.id = Date.now() + Math.random();
            this.status = 'todo';
    }
}

todo.add(new Task("자바스크립트 공부하기","programming"));
todo.add(new Task("알고리즘 공부하기","programming"));
todo.add(new Task("요가하기","health"));
todo.add(new Task("명상하기","health"));
todo.add(new Task("독서하기","reading"));
todo.add(new Task("기타치기","music"));
  • 새로운 기능 추가하는 건 다른 것에 최대~~~한 영향을 안 주도록ㅎㅎㅎ 할일을 끝마치는 데 걸리는 시간을 모두 더하여 출력하는 기능을 추가하였다.
    totalTakenTime: 0,
    executeUpdate(taskToUpdate, statusToUpdate) {
        this.totalTakenTime += takenTime;
    }
    printTotalTime(){
        const totalTakenTime = this.getTakenTimeWithUnit(this.totalTakenTime);
        console.log(`당신이 열심히 산 시간 : ${totalTakenTime}`);
    },

일기

비가 와서 그런가 살짝 울쩍했당. 요새 계속 문득문득 내가 뭐하고 있지 생각이 들 때가 있는데, 그럴 때마다 정신무장해야지~ 정~~~신~~~무우~~~~자아아~~~~앙 

주말 todo

  • EJS ch4까지 예제 풀이
  • 알바
  • 알고리즘
  • 시간되면 array parser 구경