Sqsung DevLog

[백준] 19583번: 싸이버개강총회 (Node.js) 본문

Algorithm

[백준] 19583번: 싸이버개강총회 (Node.js)

sqsung 2023. 5. 19. 11:16

1. 문제

 

19583번: 싸이버개강총회

첫번째 줄에는 개강총회를 시작한 시간 S, 개강총회를 끝낸 시간 E, 개강총회 스트리밍을 끝낸 시간 Q가 주어진다. (00:00 ≤ S < E < Q ≤ 23:59) 각 시간은 HH:MM의 형식으로 주어진다. 두번째 줄부터는

www.acmicpc.net

 

2. 풀이 

const [info, ...input] = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');

const [START, END, LIVE_END] = info.split(' ').map(val =>
  val.split(':').map(val => +val).reduce((a, c) => a * 100 + c)
);

const attendance = {};

input.forEach(chat => {
  const [time, nickname] = chat.split(' ');
  const _time = time.split(':').map(val => +val).reduce((a, c) => a * 100 + c);

  if (_time <= START) attendance[nickname] = 'Attended';

  if (_time >= END && _time <= LIVE_END && attendance[nickname]) attendance[nickname] = 'Stayed';
});

console.log(Object.values(attendance).filter(res => res === 'Stayed').length);

 

2-1. 풀이 설명 

입력 값으로 전달받은 채팅 정보를 순회하면서 시간과 닉네임을 분리한 후 개강총회 시작 전 채팅을 남긴 유저의 닉네임을 key로 attendance 객체에 프로퍼티를 만들고, 값을 Attended로 초기화했다. 

 

이미 attendnace 객체에 포함되어 있는 유저이면서, 개강총회 종료 시간 이후, 라이브 송출 종료 시간 전 채팅을 남긴 유저의 경우 attendance 객체의 값을 Stayed로 변경했다. 

 

마지막에 Stayed 값을 가진 프로퍼티의 수를 출력했다. 

 

2-2. 회고

시간 정보는 hr * 100 + min 형태로 관리했다. 처음에는 시/분 정보를 숫자 타입으로만 변환해서 사용했는데, 이러니까 시간을 비교하는 과정에서 조건문을 쓰는 과정이 너무 고통스러워졌다.