[C++] 백준(BOJ) - 2852 : NBA 농구
인프런에 있는 큰돌님의 강의 10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트를 듣고 정리한 필기입니다.
문제
동혁이는 NBA 농구 경기를 즐겨 본다. 동혁이는 골이 들어갈 때 마다 골이 들어간 시간과 팀을 적는 이상한 취미를 가지고 있다.
농구 경기는 정확히 48분동안 진행된다. 각 팀이 몇 분동안 이기고 있었는지 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 골이 들어간 횟수 N(1<=N<=100)이 주어진다. 둘째 줄부터 N개의 줄에 득점 정보가 주어진다. 득점 정보는 득점한 팀의 번호와 득점한 시간으로 이루어져 있다. 팀 번호는 1 또는 2이다. 득점한 시간은 MM:SS(분:초) 형식이며, 분과 초가 한자리 일 경우 첫째자리가 0이다. 분은 0보다 크거나 같고, 47보다 작거나 같으며, 초는 0보다 크거나 같고, 59보다 작거나 같다. 득점 시간이 겹치는 경우는 없다.
출력
첫째 줄에 1번 팀이 이기고 있던 시간, 둘째 줄에 2번 팀이 이기고 있던 시간을 출력한다. 시간은 입력과 같은 형식(MM:SS)으로 출력한다.
알고리즘
- 구현
- 문자열
풀이
- 문자열을 숫자로 바꾸고, 숫자를 문자열로 바꾸는 함수를 적극 활용한다
- 이전 문자열에 대한 정보를 저장하여 합계를 구할 때 이용한다
- 시 / 분 / 초 의 문제는 하나의 단위로 통일한다. (초를 기반으로 통일)
코드
// BOJ - 2852 : NBA 농구
#include <bits/stdc++.h>
using namespace std;
#define prev aaaa
int n, o, A, B, asum, bsum;
string str, prev;
// 포맷화
string print(int a)
{
string d = "00" + to_string(a / 60);
string e = "00" + to_string(a % 60);
return d.substr(d.size() - 2, 2) + ":" + e.substr(e.size() - 2, 2);
}
// string 문자열을 숫자로 변환하는 식 (초 단위로 통일)
int ChangeToInt(string a)
{
return atoi(a.substr(0, 2).c_str()) * 60 + atoi(a.substr(3).c_str());
}
void go(int& sum, string s)
{
sum += ChangeToInt(s) - ChangeToInt(prev);
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> o >> str;
if (A > B) go(asum, str);
else if (A < B) go(bsum, str);
o == 1 ? A++ : B++;
prev = str;
}
if (A > B) go(asum, "48:00");
else if (A < B) go(bsum, "48:00");
cout << print(asum) << '\n';
cout << print(bsum) << '\n';
return 0;
}
평가
- 승리체크 변수, 이기는 시간 합산에 대한 변수 등 여러 가지 변수를 유연하게 사용하는 방식으로 문제풀이를 이어나간다
- 문자열-숫자 변환은 매우 자주 나오는 유형이므로 유연하게 사용할 수 있어야 한다
- 마지막 지점까지 계산을 놓치지 않고 해준다