Facts

  • 이번 주부터 능동적으로 하는 과제를 시작했다

  • Nodejs 강의에서 알게된 지식들을 직접 활용해가며 응용해보았다.

  • 오랜만에 누군가에게 도움을 요청받아 도움을 주었다!

Feelings

  • 아이디어를 직접 생각해가며 그걸 구현하는 시간은 매우 즐거웠다.

  • 누군가를 가르켜주면서 지식들을 재정리 할 수 있어서 이번주가 알찼다고 느꼇다

  • 개발자로써 코딩을 통해 결과물을 만드는게 좋은 경험이었다

  • 무언갈 생각하고 구현하는 작업은 재밌는거 같다!

Finding

  • 저번주부터 블로그에 지식들을 정리해가며 과제를 하니, 해야할 일의 우선순위를 정하는데 편했다!

  • 알고리즘 문제들을 풀어가며 데이터를 쌓아 아이디어의 구현속도와 리팩토링을 통해 코드의 효율성을 높이는 경험이 좋았다

Future

  • 알고리즘 공부는 꾸준히 해야겠다!

  • 블로그의 가시성이 좋아보이지 않아 여러 스타일들을 건드려봐야겠다!


오늘의 삽질

RogueLike TextGame

랭킹 시스템 도입

  • 클리어 했을 때 점수를 서버에 저장해주는 시스템을 만들어야 겠다! (+ 이름을 저장하는 기능까지)
  1. 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);
    
  2. 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;
     }
    
  3. 값 저장할 수 있게 가져온 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;
    
  4. 메인화면에서 랭킹을 확인 할 수 있게 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;
    
  5. server.js(메인파일) 에 export/import를 이용해서 연결을 마쳤다!

리팩토링

  1. mongoose.schema(형식) 들을 모델화하여 내보내기!

    • 기존에 있던 schema 파일들 중 export가 형식만을 내보내줘 모델화를 받아온 파일 내에서 해결해야 했는데! 이를 내보낼 때부터 모델화를 하여 반복작업을 단축화했다!
  2. 각 파일들을 뜯어보면서 논리적으로 간소화 가능한 것들을 찾아 구문들을 변경해주었다.

개선점 분석

  • 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);
}