[백준] - 구현 : 2979번 트럭 주차

준성·2024년 5월 23일
0
post-thumbnail

문제를 풀어보며 기록으로 정리해본다.

문제



상근이가 트럭을 3대를 갖고 있고 한 주차장에 트럭의 수만큼 주차금액이 달라진다.
1번째 줄은 차례대로 트럭의 수만큼 주차를 하고있을 때의 가격을 얘기하고
2번째 줄부터는 3대의 차량이 각각의 주차장에 도착한 시간과 떠난 시간이다.

나의 생각


예제로 생각해봤을 때, 1대를 주차했을 때는 5원, 2대는 3원, 3대는 1원이다. 각각의 주차 시간은 A, B, C 차량이라고 얘기하면

  • A는 1시부터 6시까지 (5시간 이용)
  • B는 3시부터 5시까지 (2시간 이용)
  • C는 2시부터 8시까지 (6시간 이용)

시간이 겹치는 곳을 표시해보면

A : 1 2 3 4 5
B :     3 4 
C :   2 3 4 5 6

	1 2 3 3 2 1

1은 1대니까 5원으로 계산하고
2는 2대 * 3원으로 계산
3은 3대 * 1원으로 계산
total 33 이 나오게된다.

나의 코드


1대 요금, 2대 요금, 3대 요금을 따로 변수에 담아 줬다

const fs = require("fs");
const input = fs
  .readFileSync("/dev/stdin", "utf8")
  .toString()
  .trim()
  .split("\n");

const price = input[0].split(" ").map(Number);
const onePrice = price[0];
const twoPrice = price[1];
const threePrice = price[2];

각각의 차량의 주차시간을 반복문을 사용하여 전체 배열에 담아
중복되는 숫자들을 정렬해주었다.

A : 1 2 3 4 5
B :     3 4 
C :   2 3 4 5 6
let arr = [];

for (let i = 1; i < input.length; i++) {
  let num = input[i].split(" ").map(Number);
  for (let i = num[0]; i < num[1]; i++) {
    arr.push(i);
  }
}
let sortArr = arr.sort((a, b) => a - b);
// sortArr = [
  1, 2, 2, 3, 3, 3,
  4, 4, 4, 5, 5, 6,
  7
]

시간대가 중복되는 곳에 count를 사용해서 몇대씩 중복되는지 확인하기위해 작성했다.

let countArr = [];
let count = 1;

for (let i = 0; i < sortArr.length; i++) {
  if (sortArr[i] == sortArr[i + 1]) {
    count++;
  } else {
    countArr.push(count);
    count = 1;
  }
}

//countArr = [
  1, 2, 3, 3,
  2, 1, 1
]

1은 1대만 주차했기에 1대의 가격대로 받으면 되고
2는 2대를 주차했기에 2대의 가격대로 받고
3은 3대를 주차했기에 3대의 가격대로 받으면 된다.

let totalPrice = 0;

for (let i = 0; i < countArr.length; i++) {
  if (countArr[i] === 1) {
    totalPrice += onePrice;
  } else if (countArr[i] === 2) {
    totalPrice = totalPrice + twoPrice * 2;
  } else if (countArr[i] === 3) {
    totalPrice = totalPrice + threePrice * 3;
  }
}

// 33

전체 코드

const fs = require("fs");
const input = fs
  .readFileSync("/dev/stdin", "utf8")
  .toString()
  .trim()
  .split("\n");

const price = input[0].split(" ").map(Number);
const onePrice = price[0];
const twoPrice = price[1];
const threePrice = price[2];

let arr = [];

for (let i = 1; i < input.length; i++) {
  let num = input[i].split(" ").map(Number);
  for (let i = num[0]; i < num[1]; i++) {
    arr.push(i);
  }
}
let sortArr = arr.sort((a, b) => a - b);
let countArr = [];
let count = 1;

for (let i = 0; i < sortArr.length; i++) {
  if (sortArr[i] == sortArr[i + 1]) {
    count++;
  } else {
    countArr.push(count);
    count = 1;
  }
}
let totalPrice = 0;

for (let i = 0; i < countArr.length; i++) {
  if (countArr[i] === 1) {
    totalPrice += onePrice;
  } else if (countArr[i] === 2) {
    totalPrice = totalPrice + twoPrice * 2;
  } else if (countArr[i] === 3) {
    totalPrice = totalPrice + threePrice * 3;
  }
}

console.log(totalPrice);

ChatGPT


ChatGPT는 어떻게 생각했을까?
100까지 있는 Array를 만들어
각각의 해당하는 인덱스에 1씩 증가하게끔 작성하여
totalPrice를 구하는 방식으로 얘기해줬다

const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf8").trim().split("\n");

const [A, B, C] = input[0].split(" ").map(Number);

let timeSlots = new Array(100).fill(0);

for (let i = 1; i < input.length; i++) {
  let [start, end] = input[i].split(" ").map(Number);
  for (let j = start; j < end; j++) {
    timeSlots[j]++;
  }
}

let totalPrice = 0;

for (let i = 0; i < timeSlots.length; i++) {
  if (timeSlots[i] === 1) {
    totalPrice += A;
  } else if (timeSlots[i] === 2) {
    totalPrice += B * 2;
  } else if (timeSlots[i] === 3) {
    totalPrice += C * 3;
  }
}

console.log(totalPrice);

정리


생각대로 정리하면서 풀다보니 코드가 길어진 것 같다는 느낌이 들었고
처음 문제를 읽었을 때, 이해하는데 시간이 좀 걸렸다.
구현 문제는 항상 어려운 부분이 이해하는게 큰 것 같다.
ChatGPT의 답보다 더 나은 방법도 있겠지만 크게 또 배웠다.
시간 복잡도라는 아직 나에겐 생소한 부분에 대해서 많이 생각하게 만드는 문제였다.
결론 너무 어렵지만 재밌다 ㅜㅜ

profile
코드를 그리다.

0개의 댓글