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

김선우·2024년 11월 15일
post-thumbnail

알고리즘 문제 풀어보기

주차 요금 계산

문제 설명

주차장의 요금표와 차량이 들어오고(입차) 나간(출차) 기록이 주어졌을 때, 차량별로 주차 요금을 계산하려고 합니다. 아래는 하나의 예시를 나타냅니다.

  • 요금표
기본 시간(분)기본 요금(원)단위 시간(분)단위 요금(원)
180500010600
  • 입/출차 기록
시각(시:분)차량 번호내역
05:345961입차
06:000000입차
06:340000출차
07:595961출차
07:590148입차
18:590000입차
19:090148출차
22:595961입차
23:005961출차
  • 자동차별 주차 요금
차량 번호누적 주차 시간(분)주차 요금(원)
000034 + 300 = 3345000 + ⌈(334 - 180) / 10⌉ x 600 = 14600
01486705000 +⌈(670 - 180) / 10⌉x 600 = 34400
5961145 + 1 = 1465000
  • 어떤 차량이 입차된 후에 출차된 내역이 없다면, 23:59에 출차된 것으로 간주합니다.
    • 0000번 차량은 18:59에 입차된 이후, 출차된 내역이 없습니다. 따라서, 23:59에 출차된 것으로 간주합니다.
  • 00:00부터 23:59까지의 입/출차 내역을 바탕으로 차량별 누적 주차 시간을 계산하여 요금을 일괄로 정산합니다.
  • 누적 주차 시간이 기본 시간이하라면, 기본 요금을 청구합니다.
  • 누적 주차 시간이 기본 시간을 초과하면, 기본 요금에 더해서, 초과한 시간에 대해서 단위 시간 마다 단위 요금을 청구합니다.
    • 초과한 시간이 단위 시간으로 나누어 떨어지지 않으면, 올림합니다.
    • ⌈a⌉ : a보다 작지 않은 최소의 정수를 의미합니다. 즉, 올림을 의미합니다.

주차 요금을 나타내는 정수 배열 fees, 자동차의 입/출차 내역을 나타내는 문자열 배열 records가 매개변수로 주어집니다. 차량 번호가 작은 자동차부터 청구할 주차 요금을 차례대로 정수 배열에 담아서 return 하도록 solution 함수를 완성해주세요.

제한사항

  • fees의 길이 = 4
    • fees[0] = 기본 시간(분)
    • 1 ≤ fees[0] ≤ 1,439
    • fees[1] = 기본 요금(원)
    • 0 ≤ fees[1] ≤ 100,000
    • fees[2] = 단위 시간(분)
    • 1 ≤ fees[2] ≤ 1,439
    • fees[3] = 단위 요금(원)
    • 1 ≤ fees[3] ≤ 10,000
  • 1 ≤ records의 길이 ≤ 1,000
    • records의 각 원소는 "시각 차량번호 내역" 형식의 문자열입니다.
    • 시각, 차량번호, 내역은 하나의 공백으로 구분되어 있습니다.
    • 시각은 차량이 입차되거나 출차된 시각을 나타내며, HH:MM 형식의 길이 5인 문자열입니다.
      • HH:MM은 00:00부터 23:59까지 주어집니다.
      • 잘못된 시각("25:22", "09:65" 등)은 입력으로 주어지지 않습니다.
    • 차량번호는 자동차를 구분하기 위한, `0'~'9'로 구성된 길이 4인 문자열입니다.
    • 내역은 길이 2 또는 3인 문자열로, IN 또는 OUT입니다. IN은 입차를, OUT은 출차를 의미합니다.
    • records의 원소들은 시각을 기준으로 오름차순으로 정렬되어 주어집니다.
    • records는 하루 동안의 입/출차된 기록만 담고 있으며, 입차된 차량이 다음날 출차되는 경우는 입력으로 주어지지 않습니다.
    • 같은 시각에, 같은 차량번호의 내역이 2번 이상 나타내지 않습니다.
    • 마지막 시각(23:59)에 입차되는 경우는 입력으로 주어지지 않습니다.
    • 아래의 예를 포함하여, 잘못된 입력은 주어지지 않습니다.
      • 주차장에 없는 차량이 출차되는 경우
      • 주차장에 이미 있는 차량(차량번호가 같은 차량)이 다시 입차되는 경우

풀이 코드

function solution(fees, records) {
    const [basic_time, basic_fee, unit_time, unit_fee] = fees;
    var parking_minutes = {};
    var parking_in = {};
    var answer = [];

    records.forEach((ele, idx) => {
        const[time, car_number, io] = ele.split(" ");

        if(io === "IN"){
            parking_in[car_number] = time;
        }

        if(io === "OUT"){
            var in_time = parking_in[car_number].split(":").map(Number);
            var out_time = time.split(":").map(Number);
            var minutes = 0;

            if(out_time[1] > in_time[1]){
                minutes += out_time[1] - in_time[1];
            }
            else if(out_time[1]<in_time[1]){
                minutes += 60 + out_time[1] - in_time[1];
                out_time[0] -= 1;
            }
            minutes += (out_time[0] - in_time[0]) * 60;
            if (car_number in parking_minutes) parking_minutes[car_number] += minutes;
            else parking_minutes[car_number] = minutes;

            delete parking_in[car_number];
        }
    });
    while (Object.keys(parking_in).length > 0) {
        var keys = Object.keys(parking_in);
        var in_time = parking_in[keys[0]].split(":").map(Number);
        var minutes = (23 - in_time[0]) * 60 + (59 - in_time[1]);
        if (keys[0] in parking_minutes) parking_minutes[keys[0]] += minutes;
        else parking_minutes[keys[0]] = minutes;
        delete parking_in[keys[0]];
      }
    
      var keys = Object.keys(parking_minutes);
      const keys_len = keys.length;
      for (let i = 0; i < keys_len; i++) {
        let min_idx = 0;
        if (keys.length > 1)
          min_idx = keys.map(Number).indexOf(Math.min(...keys.map(Number)));
        let fee = basic_fee;
        
        if (parking_minutes[keys[min_idx]] > basic_time) {
          fee +=
            Math.ceil((parking_minutes[keys[min_idx]] - basic_time) / unit_time) *
            unit_fee;
        }
        answer.push(fee);
        keys.splice(min_idx, 1);
      }



    return answer;
}

풀이 과정

기본시간, 기본요금, 단위시간, 단위요금을 배열화해서 fees에 담아준다.
차량별 누적 주차시간을 넣어줄 parking_minutes, 차량별 임차 기록을 넣어줄 parking_in을 만들어 주고, records를 forEach문을 통해 입차인 경우 parking_in에 넣어주고, 출차인 경우 시간을 계산해 parking_minutes에 넣는 작업을 해준다.
이후 반복문을 통해 입차된 후 출차된 내역이 없는 경우를 따로 처리하고 이후 주차 요금을 계산해줬다.

기술 면접 공부

[Language - Javascript]

5. Arrow Function 이란 무엇인지 설명해주세요.

  • 화살표 함수 - ES6문법으로 함수 표현식보다 단순하고 간결한 문법으로 함수를 만드는 방법.
  • 화살표 함수에서는 this를 정의하지 않는다.
    ex)
let func = (arg1, arg2, ...argN) => expression

===

let func = function(arg1, arg2, ...argN) {
  return expression;
};
  • 위의 예시 코드처럼 긴 함수를 한줄로 축약해서 같은 의미를 가진 함수로 만들 수 있다.
let sum = (a, b) => a + b;

/* 위 화살표 함수는 아래 함수의 축약 버전입니다.

let sum = function(a, b) {
  return a + b;
};
*/

alert( sum(1, 2) ); // 3

예시

  • 인수가 하나밖에 없다면 인수를 감싸는 괄호를 생략할 수 있다. => 코드 길이를 더 줄일 수 있음.
let double = n => n * 2;
// let double = function(n) { return n * 2 }과 거의 동일합니다.

alert( double(3) ); // 6
  • 인수가 하나도 없을 땐 괄호를 비워둘 수 있다. => 이때 괄호는 생략할 수 없다.
let sayHi = () => alert("안녕하세요!");

sayHi();

정리

  • 화살표 함수는 본문이 한 줄인 함수를 작성할 때 유용.
    => 한줄이 아니라면 다른 방법으로 화살표 함수를 작성해야 함.
    • 중괄호 없이 작성: (...args) => expression – 화살표 오른쪽에 표현식을 둡니다. 함수는 이 표현식을 평가하고, 평가 결과를 반환합니다.
    • 중괄호와 함께 작성: (...args) => { body } – 본문이 여러 줄로 구성되었다면 중괄호를 사용해야 합니다. 다만, 이 경우는 반드시 return 지시자를 사용해 반환 값을 명기해 주어야 합니다.

6. Express란 무엇이고 왜 필요하며 대안은 무엇이 있는지 설명해주세요.

  • Express - 웹 및 모바일 애플리케이션을 위한 일련의 강력한 기능을 제공하는 간결하고 유연한 Node.js 웹 애플리케이션 프레임워크. Node.js는 표준 웹서버 프레임워크로 불려질 만큼 많은 곳에서 사용하고 있다.

Node.js와의 관계

  • Node.js는 Chrome의 V8엔진을 이용해 JS로 브라우저가 아니라 서버를 구축하고, 서버에서 JS가 작동되도록 해주는 런타임 환경(플랫폼)이다. Express는 이런 Node.js의 원칙과 방법을 이용해 웹 애플리케이션을 만들기 위한 프레임워크이다.
    => Express = Node.js를 사용해 쉽게 서버를 구성할 수 있게 만든 클래스와 라이브러리의 집합체.

필요 이유

  • Express는 프레임워크이므로 웹 애플리케이션을 만들기 위한 각종 라이브러리와 미들웨어 등이 내장되어있어 개발이 편하고, 수많은 개발자들에게 개발 규칙을 강제해 코드 및 구조의 통일성을 향상시킬 수 있다.
  • 또한, 다른 Adonis.js, Koa, Sails.js같은 프레임워크를 사용해도 되지만 가장 유명하고 널리 사용되기 때문에 Express를 사용하는게 프레임워크를 배우는 면에서 좋을 것이다.

최종 프로젝트

redis, mysql을 어떻게 사용할지를 정해주고 캐릭터 컨셉정도를 짰다.
이후 주말동안

  • 상점에서 판매할 아이템, 아이템의 등급, 아이템이 떨어지는 장소.
  • 던전에서 나올 보상이 어떤건지.(구체적인 사항X, 떨어지는 아이템의 등급, 조합 전용 아이템 재료 등)

해당 부분을 생각해보고 월요일에 말해보기로 했다.

0개의 댓글