JS-algorithm/BOJ

[백준] 전화 요금 (javascript)

yunieyunie 2023. 10. 19. 22:30

https://www.acmicpc.net/problem/3226

 

3226번: 전화 요금

첫째 줄에 상근이가 건 전화의 수 N이 주어진다. (1 ≤ N ≤ 100) 다음 N개 줄에는 상근이가 건 전화에 대한 정보가 HH:MM DD와 같은 형식으로 주어진다. HH:MM은 전화를 건 시간이며, DD는 통화 시간이

www.acmicpc.net

 

 

🤔 해결방법

1. 전화를 건 시간과 통화 시간 값을 이중 배열로 저장

2. 7:00부터 19:00까지에 해당되면 fee += 통화 시간 x 10원, 19:00부터 7:00까지에 해당되면 fee += 통화 시간 x 5원

3. 이때 18시에서 19시로 넘어가는 경우와 6시에서 7로 넘어가는 경우를 나눠서 계산

 

 

🔑 풀이

먼저 입력되는 전화를 건 시간과 통화 시간 값들을 이중 배열로 arr에 넣었다. (e.g. 11:02 11는 [11, 2, 11] 로 arr에 push)

for (let i = 1; i <= n; i++) {
    const [call, time] = input[i].split(" ");
    const [callHour, callMinute] = call.split(":").map(Number);
    arr.push([callHour, callMinute, Number(time)]);
  }

 

만약 7:00부터 19:00까지에 해당된다면 fee += 통화 시간 x 10원을 한다.

그런데 현재 18시면서 통화 시간을 합했을 때 19시로 넘어가게 되면, 넘어가기 전까지는 x 5원, 넘어간 분 x 10원을 해준다.

 

반대로 19:00부터 7:00까지에 해당된다면 fee += 통화 시간 x 5원을 한다.

그런데 현재 6시면서 통화 시간을 합했을 때 7시로 넘어가게 되면, 넘어가기 전까지는 x 10원, 넘어간 분 x 5원을 해준다.

for (let i = 0; i < arr.length; i++) {
    // 7:00부터 19:00까지
    if (arr[i][0] >= 7 && arr[i][0] < 19) {
      if (arr[i][0] === 18 && arr[i][1] + arr[i][2] >= 60) {
        fee += (arr[i][1] + arr[i][2] - 60) * 5;
        fee += (60 - arr[i][1]) * 10;
      } else {
        fee += arr[i][2] * 10;
      }
      // 19:00부터 7:00까지
    } else {
      if (arr[i][0] === 6 && arr[i][1] + arr[i][2] >= 60) {
        fee += (arr[i][1] + arr[i][2] - 60) * 10;
        fee += (60 - arr[i][1]) * 5;
      } else {
        fee += arr[i][2] * 5;
      }
    }
  }

 

최종 코드는 다음과 같다.

const input = require("fs")
    // .readFileSync("/dev/stdin")
    .readFileSync(__dirname + "/input.txt")
    .toString()
    .trim()
    .split("\n");

  const n = Number(input[0]);
  let arr = [];
  let fee = 0;

  for (let i = 1; i <= n; i++) {
    const [call, time] = input[i].split(" ");
    const [callHour, callMinute] = call.split(":").map(Number);
    arr.push([callHour, callMinute, Number(time)]);
  }

  for (let i = 0; i < arr.length; i++) {
    // 7:00부터 19:00까지
    if (arr[i][0] >= 7 && arr[i][0] < 19) {
      if (arr[i][0] === 18 && arr[i][1] + arr[i][2] >= 60) {
        fee += (arr[i][1] + arr[i][2] - 60) * 5;
        fee += (60 - arr[i][1]) * 10;
      } else {
        fee += arr[i][2] * 10;
      }
      // 19:00부터 7:00까지
    } else {
      if (arr[i][0] === 6 && arr[i][1] + arr[i][2] >= 60) {
        fee += (arr[i][1] + arr[i][2] - 60) * 10;
        fee += (60 - arr[i][1]) * 5;
      } else {
        fee += arr[i][2] * 5;
      }
    }
  }

  console.log(fee);

 

제출 결과 메모리는 9400kb 시간은 120ms이 나왔다.

좀 더 가독성이 좋은 코드를 찾아봤는데 for문을 돌며 각 분에 대해 요금을 계산하는 풀이가 있었다.

const calculateFee = (hour, minute, duration) => {
    let totalFee = 0;

    for (let i = 0; i < duration; i++) {
      const currentMinute = (minute + i) % 60;
      const currentHour = hour + Math.floor((minute + i) / 60);

      if (currentHour >= 7 && currentHour < 19) {
        totalFee += 10;
      } else {
        totalFee += 5;
      }
    }

    return totalFee;
  };

  for (let i = 0; i < arr.length; i++) {
    const [hour, minute, duration] = arr[i];
    fee += calculateFee(hour, minute, duration);
  }

 

 

메모리는 9468kb, 시간은 124ms로 내 코드보다 아주 조금 더 메모리를 차지하고 느리지만 가독성은 더 좋은 코드라 할 수 있겠다.