Facts
-
이번 주부터 능동적으로 하는 과제를 시작했다
-
Nodejs 강의에서 알게된 지식들을 직접 활용해가며 응용해보았다.
-
오랜만에 누군가에게 도움을 요청받아 도움을 주었다!
Feelings
-
아이디어를 직접 생각해가며 그걸 구현하는 시간은 매우 즐거웠다.
-
누군가를 가르켜주면서 지식들을 재정리 할 수 있어서 이번주가 알찼다고 느꼇다
-
개발자로써 코딩을 통해 결과물을 만드는게 좋은 경험이었다
-
무언갈 생각하고 구현하는 작업은 재밌는거 같다!
Finding
-
저번주부터 블로그에 지식들을 정리해가며 과제를 하니, 해야할 일의 우선순위를 정하는데 편했다!
-
알고리즘 문제들을 풀어가며 데이터를 쌓아 아이디어의 구현속도와 리팩토링을 통해 코드의 효율성을 높이는 경험이 좋았다
Future
-
알고리즘 공부는 꾸준히 해야겠다!
-
블로그의 가시성이 좋아보이지 않아 여러 스타일들을 건드려봐야겠다!
오늘의 삽질
RogueLike TextGame
랭킹 시스템 도입
- 클리어 했을 때 점수를 서버에 저장해주는 시스템을 만들어야 겠다! (+ 이름을 저장하는 기능까지)
-
MongoDB에 저장할 수 있게 Schema(형식) 만들고 내보내기!
import mongoose from "mongoose" //형식 이름 const rank = new mongoose.Schema({ // // 이름 name: { type: String, required: true, }, // //기본 데미지 score: { type: Number, required: true, } }) //형식을 이용해 "모델"로 만들어 내보내기! <= 보낸 값으로 DB와 바로 접속가능! export default mongoose.model('ranking', rank);
-
ending에 이름 추가하는 기능 만들기!
//선택지 출력 console.log(chalk.yellowBright(`\n1. 점수 기록 2.메인 화면 3. 현타와서 종료`)); const choice = readlineSync.question('당신의 행동은? '); switch (choice) { case '1': console.log(chalk.yellowBright('점수를 기록하기 위해 이름을 입력해주세요!')); //이름 받아서 저장 const name = readlineSync.question('이름 : '); console.log(chalk.cyanBright(`저장될 값 / 이름 : ${name} 점수 : ${player.score}`)); case '2': console.log(chalk.yellowBright('메인화면으로 이동합니다!')); return start(); case '3': console.log(chalk.redBright('게임이 종료됩니다!')); process.exit(0); default: console.log(chalk.redBright('올바르지 않은 접근입니다.')); continue; }
-
값 저장할 수 있게 가져온 ranking 이용하기!
case '1': console.log(chalk.yellowBright('점수를 기록하기 위해 이름을 입력해주세요!')); //이름 받아서 저장 const name = readlineSync.question('이름 : '); console.log(chalk.cyanBright(`저장될 값 / 이름 : ${name} 점수 : ${player.score}`)); //저장할 값 생성 const newScore = new ranking({ name: name, score: player.score, }); //값 DB에 저장 await newScore .save() .then(async () => { logs.push(chalk.greenBright('실행되었습니다!')); // 올린 값 업데이트 해주기 await update(); }) .catch((err) => console.log(chalk.redBright('저장실패!'))); continue;
-
메인화면에서 랭킹을 확인 할 수 있게 event에 새로운 파일 생성!
import ranking from "../storage/rank-schema.js" const rankList = async () => { //랭킹 가져오기 let list = await ranking.find().exec() // 전체 순위에서 10명까지만 보이게 설정 list = list.sort((a,b) => { return b.score - a.score}).splice(0,10) // 화면 출력부는 생략했습니다! readlineSync.question('메인화면<<'); return start() }; export default rankList;
-
server.js(메인파일) 에 export/import를 이용해서 연결을 마쳤다!
리팩토링
-
mongoose.schema(형식) 들을 모델화하여 내보내기!
- 기존에 있던 schema 파일들 중 export가 형식만을 내보내줘 모델화를 받아온 파일 내에서 해결해야 했는데! 이를 내보낼 때부터 모델화를 하여 반복작업을 단축화했다!
-
각 파일들을 뜯어보면서 논리적으로 간소화 가능한 것들을 찾아 구문들을 변경해주었다.
개선점 분석
- Git을 이용하여 과제/프로젝트를 진행할 때, 변경사항이 생길때 마다 올려주는 습관이 필요하다!
(팀 프로젝트에서 관리하기 편한 습관!)
지식창고
알고리즘
-
주어진 문제를 해결하는 방법 또는 절차를 컴퓨터가 따라할 수 있도록 만든 것
-
알고리즘은 최대한 간결하고 알맞은 해결방법을 찾는게 중요함
컴퓨팅 사고 능력
- 어려운 문제를 보다 작고 쉬운 부분으로 나눠 부분들을 체계적으로 해결해 큰 문제를 해결하는 능력 => 어려운 걸 핵심만을 쉽게 분석해 해결!
시간 복잡도
-
함수에 입력(N)을 주었을 때 문제를 해결하는데 걸리는 시간과의 관계
-
빅오 표기법으로 O(시간복잡도) 가 있다. 이 표기법은 최악의 수를 경우에두고 표기한다
공간 복잡도(현업에선 중요도가 미미함)
- 함수에 입력(N)을 주었을 때 반환까지 하는데 드는 메모리 비용
LinckedList
-
유동적으로 관계를 떼었다가 붙일 수 있는 자료 구조
-
배열 대신 직접 만들어 쓰는 구조로 삭제/추가에는 강점이 있으나 조회는 배열과 똑같다
Stack 자료형
- 후입선출 (창고 형)
Queue 자료형
- 선입선출 (대기열 형)
정렬 알고리즘
-
버블 정렬 O(N^2) 근접한 수들끼리 여러번 비교하여 최종자리를 찾는 법
-
선택 정렬 O(N^2) 배열을 돌면서 가장작은 수를 찾아 위치를 맨앞으로 고정시키고, 남은 수들끼리 이 과정을 반복해 현재 수보다 작은 수가 나오면 그 수와 위치를 바꿈
-
삽입 정렬 O(N^2) ~ (최선일 때 N) 기존의 수보다 다음 수가 작을 경우, 이전 값들과 비교하여 위치를 선정해 그곳에 삽입해주는 방식
ASCII 코드
- ASCII 코드 함수와 알파벳 10진수
// ASCII 코드상 대문자 65 ~ 90
// ASCII 코드상 소문자 97 ~ 122
Number.charCodeAt()
// 문자를 ASCII 코드를 이용해 숫자로 변환
String.fromCharCode(Number)
// 숫자를 ASCII 코드를 이용해 문자/기호로 변환
숫자 문자열과 영단어
- 문제 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.
숫자 | 영단어 |
---|---|
0 | zero |
1 | one |
2 | two |
3 | three |
4 | four |
5 | five |
6 | six |
7 | seven |
8 | eight |
9 | nine |
- 조건
1 ≤ s의 길이 ≤ 50 s가 “zero” 또는 “0”으로 시작하는 경우는 주어지지 않습니다. return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.
function solution(s) {
let answer = 0;
while (s.length) {
let num = s.substr(0, 2)
// 문자열 변환
switch (num) {
case "ze":
s = s.slice(4)
answer += "0"
break;
case "on":
s = s.slice(3)
answer += "1"
break;
case "tw":
s = s.slice(3)
answer += "2"
break;
case "th":
s = s.slice(5)
answer += "3"
break;
case "fo":
s = s.slice(4)
answer += "4"
break;
case "fi":
s = s.slice(4)
answer += "5"
break;
case "si":
s = s.slice(3)
answer += "6"
break;
case "se":
s = s.slice(5)
answer += "7"
break;
case "ei":
s = s.slice(5)
answer += "8"
break;
case "ni":
s = s.slice(4)
answer += "9"
break;
default:
answer += s.slice(0,1)
s = s.slice(1)
break;
}
}
return Number(answer);
}
- 다른 코드 분석
function solution(s) {
//숫자 문자열 배열 생성
const numbers = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"];
//받은 문자를 answer에 저장
let answer = s;
//numbers 에 있는 문자열들을 한번씩 반복 (i와 변환될 숫자가 동일!)
for(let i=0; i< numbers.length; i++) {
//arr이란 배열에 number[i]를 빼고, 나머지를 갈라서 할당!
let arr = answer.split(numbers[i]);
//제외한 곳에 변환될 숫자 i를 삽입하며 할당!
answer = arr.join(i);
}
return Number(answer);
}