https://www.acmicpc.net/problem/2852
문제
동혁이는 NBA 농구 경기를 즐겨 본다. 동혁이는 골이 들어갈 때 마다 골이 들어간 시간과 팀을 적는 이상한 취미를 가지고 있다.
농구 경기는 정확히 48분동안 진행된다. 각 팀이 몇 분동안 이기고 있었는지 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 골이 들어간 횟수 N(1<=N<=100)이 주어진다. 둘째 줄부터 N개의 줄에 득점 정보가 주어진다. 득점 정보는 득점한 팀의 번호와 득점한 시간으로 이루어져 있다. 팀 번호는 1 또는 2이다. 득점한 시간은 MM:SS(분:초) 형식이며, 분과 초가 한자리 일 경우 첫째자리가 0이다. 분은 0보다 크거나 같고, 47보다 작거나 같으며, 초는 0보다 크거나 같고, 59보다 작거나 같다. 득점 시간이 겹치는 경우는 없다.
출력
첫째 줄에 1번 팀이 이기고 있던 시간, 둘째 줄에 2번 팀이 이기고 있던 시간을 출력한다. 시간은 입력과 같은 형식(MM:SS)으로 출력한다.
문제 풀이
문자열 문제.
골을 넣어야 이전 체크포인트부터 골을 넣은 시간까지의 점유 시간을 구할 수 있다. 따라서 골을 넣은 시간마다 현재 시간 - 이전 골을 넣은 시간을 점수에 따라 두 팀 중 한 팀에 부여해주면 된다. 현재 골을 넣은 것을 점수에 계산하기 이전 점수가 1팀과 2팀이 같았다면 이전 시점 ~ 현재 골을 넣은 시점까지 무승부였다는 뜻이므로 어느 팀에도 이기고 있던 시간을 더하지 않는다.
모든 입력을 다 받았다면 같은 방식으로 마지막 골을 넣은 시점부터 경기가 끝날 때까지의 이기고 있던 시간도 구해준다.
시간을 <분 * 60 + 초>로 계산하여 게임이 시작하고 몇 초가 지났는지로 변환하면 시간을 쉽게 계산할 수 있다.
아래는 코드.
#include <iostream>
#include <string>
using namespace std;
void add(string& str1, string& str2)
{
if (str2.length() == 1)
{
str1 += "0" + str2;
}
else
{
str1 += str2;
}
}
string convertString(int min, int sec)
{
string str = "";
string minStr = to_string(min);
string secStr = to_string(sec);
add(str, minStr);
str += ":";
add(str, secStr);
return str;
}
int main()
{
cin.tie(NULL);
ios::sync_with_stdio(false);
int N, team;
string str;
cin >> N;
int APoint = 0;
int BPoint = 0;
int ATime = 0;
int BTime = 0;
int prevTime = 0;
for (int i = 0; i < N; i++)
{
cin >> team >> str;
int min = stoi(str.substr(0, 2));
int sec = stoi(str.substr(3));
int time = min * 60 + sec;
if (APoint < BPoint)
{
BTime += time - prevTime;
}
else if (APoint > BPoint)
{
ATime += time - prevTime;
}
if (team == 1)
{
APoint++;
}
else
{
BPoint++;
}
prevTime = time;
}
int time = 2880;
if (APoint < BPoint)
{
BTime += time - prevTime;
}
else if (APoint > BPoint)
{
ATime += time - prevTime;
}
cout <<convertString(ATime / 60, ATime % 60)<<"\n";
cout << convertString(BTime / 60, BTime % 60)<<"\n";
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준 26070] 곰곰이와 학식 (C++) (0) | 2025.02.22 |
---|---|
[백준 23300] 웹 브라우저 2 (C++) (0) | 2025.02.20 |
[백준 29728] 실버와 소수는 둘다 S로 시작한다 (C++) (0) | 2025.02.16 |
[백준 16471] 작은 수 내기 (C++) (0) | 2025.02.14 |
[백준 25325] 학생 인기도 측정 (C++) (0) | 2025.02.12 |