[백준] 전화 요금 (javascript)
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로 내 코드보다 아주 조금 더 메모리를 차지하고 느리지만 가독성은 더 좋은 코드라 할 수 있겠다.