티스토리 뷰

문제

 

학생들이 한 달간 통화한 n개의 통화 기록 A가 주어진다. 한 개의 통화 기록은 통화 시간과 학생 이름이 공백으로 구분되어 주어진다. 한 학생의 통화 기록이 여러 번 주어질 수 있다. 통화 시간은 시:분 형태로 주어지고 시와 분은 길이가 2인 문자열이다. 학생 이름은 알파벳 소문자로 이루어져 있다. 통화 요금표는 다음과 같다.

  • 기본 시간(분): 100분, 기본 요금(원): 10, 단위 시간(분): 50, 단위 요금(원): 3

통화 요금은 학생별로 한 달간 통화한 누적 통화 시간에 대하여 청구된다. 누적 통화 시간이 기본 시간 이하라면 기본 요금이 청구된다. 누적 통화 시간이 기본 시간을 초과하면, 기본 요금에 더해서 초과한 시간에 대해서 단위 시간마다 단위 요금이 청구된다. 초과한 시간이 단위 시간으로 나누어떨어지지 않으면 올림 한다.

통화 요금이 많은 학생부터 이름과 통화 요금을 출력하자. 통화 요금이 같은 학생은 학생 이름 기준으로 오름차순으로 출력하자.

 

해결과정

Map 객체를 이용하여 문제를 해결하였다.

Map에 키를 이름으로 하고, 값을 총 통화시간으로 하여 각 사람마다 총 통화시간을 저장하였다. 그 후 통화 시간에 맞게 요금을 계산하여 새로운 배열에 할당해주었다. 출력 형식에 맞추기 위해 추가 요금을 기준으로 내림차순으로 정렬하고, 추가 요금이 같은 경우에는 이름을 기준으로 오름차순으로 정렬해주었다.

 

전체 코드

const fs = require("fs");
const input = fs
  .readFileSync("/dev/stdin")
  .toString()
  .trim()
  .split("\n")
  .map((v) => v.trim());

input.shift();

// 1
const map = new Map();

// 2
input.forEach((value) => {
  const [time, name] = value.split(" ");
  const [h, m] = time.split(":");
  map.set(name, map.get(name) + h * 60 + Number(m) || h * 60 + Number(m));
});

// 3
const arr = [...map].map((value) => {
  // 4
  if (value[1] <= 100) {
    return [value[0], 10];
  } else {
    const addition = Math.ceil((value[1] - 100) / 50);
    return [value[0], 10 + addition * 3];
  }
});

// 5
arr.sort((a, b) => {
  if (b[1] == a[1]) return a[0].localeCompare(b[0]);
  return b[1] - a[1];
});

let result = arr.map((value) => {
  return `${value[0]} ${value[1]}`;
});

console.log(result.join("\n"));
  1. Map 객체를 생성하여 이름을 키로, 총 통화 시간을 값으로 하는 맵을 생성한다.
  2. 입력 데이터를 순회하며 각 사람의 통화 시간을 저장한다.
  3. 맵을 배열로 변환하고, 각 작업에 대한 결과를 배열에 저장
  4. 통화 시간이 100분 이하인 경우에는 고정 요금인 10을 할당하고, 그 이상인 경우 초과된 시간에 대해 추가 요금을 계산하여 할당
  5.  추가 요금을 기준으로 내림차순으로 정렬하고, 추가 요금이 같은 경우에는 이름을 기준으로 오름차순으로 정렬

 

 

문제 링크 : https://www.acmicpc.net/problem/25329

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함