181026 TIL Lec3 할일관리 step4 & 페어프로그래밍(로또생성기)
Oct 26, 2018
»
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
알고리즘 강의
-
1만 시간의 재발견 - 의도적인 불편함, 컴포트 존 벗어나기
-
array representation, vertex, node, line…
로또생성기
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 구경