동혁이는 NBA 농구 경기를 즐겨 본다. 동혁이는 골이 들어갈 때 마다 골이 들어간 시간과 팀을 적는 이상한 취미를 가지고 있다.
농구 경기는 정확히 48분동안 진행된다. 각 팀이 몇 분동안 이기고 있었는지 출력하는 프로그램을 작성하시오.
첫째 줄에 골이 들어간 횟수 N(1<=N<=100)이 주어진다. 둘째 줄부터 N개의 줄에 득점 정보가 주어진다. 득점 정보는 득점한 팀의 번호와 득점한 시간으로 이루어져 있다. 팀 번호는 1 또는 2이다. 득점한 시간은 MM:SS(분:초) 형식이며, 분과 초가 한자리 일 경우 첫째자리가 0이다. 분은 0보다 크거나 같고, 47보다 작거나 같으며, 초는 0보다 크거나 같고, 59보다 작거나 같다. 득점 시간이 겹치는 경우는 없다.
첫째 줄에 1번 팀이 이기고 있던 시간, 둘째 줄에 2번 팀이 이기고 있던 시간을 출력한다. 시간은 입력과 같은 형식(MM:SS)으로 출력한다.
3
1 01:10
2 21:10
2 31:30
20:00
16:30
분×60+초로 계산하여 goalTime에 저장한다. 이전 골에서 이기고 있던 팀과 현재까지 이기고 있는 팀이 동일할 경우 / 이기는 팀이 있었지만, 이번 골로 동점이 된 경우 / 이전에는 동점이었지만 이번 골로 이기고 있는 팀이 생긴 경우 / 이기는 팀이 바뀐 경우가 있다. 이기고 있던 팀은 currentWin이고 현재 이기고 있는 팀은 win이므로 이를 비교하여 1번 경우와 2, 3, 4 경우로 나눌 수 있다. 이기는 팀의 변화가 없을 경우에는 특별히 계산해줄 것이 없다. 이기는 팀의 변화가 생겼을 때, 동점이 되었다면 이전에 이기고 있던 팀의 이기고 있던 시간을 계산해주어야 한다. goalTime(현재 골이 들어간 시간)-prevGoal(이기고 있게 해준 첫 골 시간)을 계산하여 currentWin의 시간을 증가시켜주고, currentWin을 null로 바꿔준다. 동점이었다가 이기는 팀이 생긴 경우, 이기고 있는 팀의 정보를 기록하기 위해 currentWin을 win으로 prevGoal을 goalTime으로 저장해준다. 이기는 팀이 바뀐 경우에도 이전까지 이기고 있던 팀의 시간을 계산하여 시간을 증가시켜주고 currentWin을 win으로 prevGoal을 goalTime으로 저장해준다.const fs = require('fs');
let [N, ...input] = fs.readFileSync(0, 'utf-8').toString().trim().split('\n');
N = Number(N);
let score = [0, 0];
let currentWin = null;
let prevGoal = 0;
let answer = [0, 0];
for (let i = 0; i < N; i++) {
let goal = input[i].trim().split(' ');
let time = goal[1].split(':');
score[Number(goal[0]) - 1]++;
if (score[0] !== score[1]) win = score[0] < score[1] ? 2 : 1;
else win = null;
let goalTime = Number(time[0]) * 60 + Number(time[1]);
if (currentWin === win) {
//이기는 사람 유지
if (i === N - 1) {
answer[currentWin - 1] += 48 * 60 - prevGoal;
}
} else {
if (currentWin === null) {
// 이기는 사람 변화 && 이전까진 동점
currentWin = win;
prevGoal = goalTime;
if (i === N - 1) {
answer[currentWin - 1] += 48 * 60 - prevGoal;
}
} else if (win === null) {
// 동점됨
answer[currentWin - 1] += goalTime - prevGoal;
currentWin = win;
prevGoal = goalTime;
} else {
// 이기는 사람 변화 && A->B로 변화
answer[currentWin - 1] += goalTime - prevGoal;
currentWin = win;
prevGoal = goalTime;
if (i === N - 1) {
answer[currentWin - 1] += 48 * 60 - prevGoal;
}
}
}
}
for (let i = 0; i < 2; i++) {
let t = `${
Math.floor(Math.floor(answer[i] / 60) / 10) === 0 ? `0${Math.floor(answer[i] / 60)}` : Math.floor(answer[i] / 60)
}:${Math.floor((answer[i] % 60) / 10) === 0 ? `0${answer[i] % 60}` : answer[i] % 60}`;
console.log(t);
}
오늘 컨디션이 좋지 않아서 그런지 문제 풀이하는 데 집중이 하나도 안 됐다. 의도대로 안 풀려서 잠시 쉬고 다시 풀어봤는데 그래도 다행히 정리가 잘 돼서 금방 풀이할 수 있었다. 금방 구현할 수 있는 문제였는데 시간을 너무 쓴 것 같아서 아쉽다. 경우가 4가지나 되는데 정리하지 않고 그냥 구현하려다보니 머릿속이 복잡했던 것도 오래 걸린 것 같다. 주석 쓰는 습관이 없어서 그런지 자꾸 헷갈렸는데 답답해서 주석을 쓰니까 바로 풀렸다. (나쁜 것도 아니고 오히려 좋은 건데 왜 안 쓰나 모르겠다.) 어렵진 않은데 은근 신경 써줘야 할 것 많아서 그런지 실버3인 것 같군.