내일배움캠프 Node.js 본캠프 31일차

김선우·2024년 9월 22일
post-thumbnail

알고리즘 문제 풀어보기

모의고사

문제 설명

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.

1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...

1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한 조건

시험은 최대 10,000 문제로 구성되어있습니다.
문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.

풀이 코드

function solution(answers) {
    var answer = [];
    
    var s1 = [1, 2, 3, 4, 5];
    var s2 = [2, 1, 2, 3, 2, 4, 2, 5];
    var s3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
    var score = [0, 0, 0];
    
    for (i = 0; i < answers.length; i++) {
        if (s1[i % s1.length] === answers[i]) {
            score[0]++;
        }
        if (s2[i % s2.length] === answers[i]) {
            score[1]++;
        }
        if (s3[i % s3.length] === answers[i]) {
            score[2]++;
        }
    }
    
    var max = Math.max(...score);
    for (j = 0; j < score.length; j++) {
        if (score[j] === max) {
            answer.push(j + 1);
        }
    }
    
    return answer;
}

풀이 과정

수포자들이 찍는 방식의 패턴과 채점표를 각각 배열로 변환 후 answers의 길이만큼 반복문을 돌려 맞힌 횟수만큼을 각각의 score에 입력함. 이후 가장 많은 문제를 맞힌 사람을 배열에 담아서 return.

Prisma

ORM(Object Relation Mapping)중 하나, Javascript 객체(Object)와 데이터베이스의 관계(Relation)를 연결(Mapping)해주는 도구.
=> Node.js에서는 다양한 ORM이 존재하지만 Prisma가 TypeScript에서도 사용할 수 있고 ORM 개념 학습에 쉬움.

ORM은 여러 관계형 데이터베이스(RDB)를 사용할 수 있음.

Prisma vs mongoose

Prismamongoose
ORM(객체와 데이터베이스의 관계를 연결)ODM(객체를 Document와 연결)
다양한 데이터베이스를 지원MongoDB만 지원
Model의 형태로 테이블의 속성을 설정Schema의 형태로 컬렉션에 대한 속성을 설정

ORM의 장단점

장점

  • 프로덕션에서 사용하는 데이터베이스가 언제바뀔 지 알 수 없음.
    =>MySQL을 사용중이라 가정했을 때, DB를 변경하려면 Raw Query코드를 변경하려는 DB로 변경하거나 그냥 MySQL을 사용해야 하는데 ORM 도입 시 단순히 속성값만 변경하면 자유롭게 DB를 변경할 수 있게 되어 선택폭이 넓어짐.
  • 데이터베이스에서 사용하는 DB또는 Table 속성이 변경되었을 때 빠르게 수정이 가능.
    =>Raw Query로 구현했다고 가정했을 때, 모든 API를 해당하는 쿼리에 맞게 수정해야 하지만 ORM을 사용할 경우 Prisma의 model을 수정하는 것으로 Raw Query를 수정하지 않고 값에 대한 정보를 추가할 수 있음.

단점

  • JOINUNION 연산자를 동시에 사용하는 복잡한 쿼리를 작성할 경우, ORM으로 구현하기 위해 SQL 보다는 ORM을 더 깊게 이해해야 하는 상황이 발생할 수 있고, 이로인해 원인과 결과가 뒤집힌 상황이 발생할 수도 있음.

  • 서브 쿼리를 포함하는 복잡한 쿼리를 작성하거나, ORM의 SQL로 변환해주는 시간 조차 아까운 극한의 성능을 요구하는 쿼리가 필요한 상황에서는 Raw Query를 사용하는 것이 더욱 좋을 수 있음.

데이터베이스 URL

Prisma가 어떤 데이터베이스와 어떻게 연결할지를 알려주는 중요한 정보.
URL내부에는 데이터베이스 엔진 유형, 사용자 아이디, 패스워드 같은 정보가 포함.

  • Protocol
    • Prisma가 사용할 데이터베이스 엔진을 나타냅니다.
    • postgresql, sqllite, mysql과 같은 데이터베이스 엔진을 정의합니다.
  • Base URL
    • 데이터베이스의 엔드 포인트아이디, 패스워드, 포트 번호를 나타냅니다.
    • <Id>:<Password>@<RDS Endpoint>:<Port>의 형태로 구성됩니다.
  • Path
    • MySQL에서 사용할 데이터베이스 이름을 설정하는 구성 요소입니다.
  • Arguments
    • Prisma에서 데이터베이스 연결을 설정하는데 필요한 추가 옵션을 나타냅니다.
    • 데이터베이스와 연결할 수 있는 최대 커넥션 갯수, 타임아웃 시간 등이 있습니다.

팀 프로젝트


내가 맡은 부분은 회원가입~캐시 구매까지 계정에 관한 내용들이었다.

회원가입

강의 자료를 완전히 다보고 구현한게 아니라 못 본 부분이 있었어서 좀 많이 헤맷다. 강의 자료를 다시 보고 구글링을 하면서 코드를 작성하였고, 위의 오류가 안뜰때 유저 데이터를 저장해서 회원가입이 되는 식으로 구현했다.

로그인


user_id와 password를 입력받아 서버에 저장된 데이터를 확인하고 해당 값이 맞으면 jwt토큰을 받고 로그인에 성공하게 구현했다.

계정조회


입력받은 id값으로 해당 id에 대한 데이터를 조회하게 만들었지만...이미 토큰으로 인증받은 상태이기 때문에 따로 값을 입력해주지 않아도 토큰을 발급받은 id에 대한 데이터가 조회되게 만들어졌다.

계정삭제


일단 작성을 해봤는데 오류가 나서 월요일에 확인해보고 다시 작성할 예정이다.

캐시구매


중요한 부분은 아니고 단순하게 하라셔서 단순하게 만들었다.
계정조회와 마찬가지로 id와 cash값을 입력받아 cash를 추가하는 식으로 구현해줫지만, 마찬가지로 토큰으로 인증 받은 상태이기 때문에 id값은 입력하지 않고 cash값만 입력해줘도 구매가 가능했다.

0개의 댓글