# 본인 풀이
#include<bits/stdc++.h>
using namespace std;
int n, team;
pair<int, int> score;
pair<int, int> lead_time;
pair<int, int> last_score_time;
int lead;
bool is_first = true;
string t;
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
for (int i = 0; i < n; i++){
cin >> team >> t;
int minute = atoi(t.substr(0, 2).c_str());
int second = atoi(t.substr(3, 5).c_str());
if(team == 1){
score.first++;
if (is_first){
lead = 1;
}else{
last_score_time.first = 60 * minute + second;
}
}
else{
score.second++;
if (is_first){
lead = 2;
}else{
last_score_time.second = 60 * minute + second;
}
}
is_first = false;
if(score.first > score.second){
lead = 1;
}else if(score.first < score.second){
lead = 2;
}
if(lead == 1 && last_score_time.first){
lead_time.first += minute * 60 + second - last_score_time.first;
}else if(lead == 2 && last_score_time.second){
lead_time.second += minute * 60 + second - last_score_time.second;
}
if(i == n-1 && lead == 1){
lead_time.first += 48 * 60 - minute * 60 - second;
}
else if (i == n - 1 && lead == 2){
lead_time.second += 48 * 60 - minute * 60 - second;
}
}
int minute1 = lead_time.first / 60;
int second1 = lead_time.first % 60;
int minute2 = lead_time.second / 60;
int second2 = lead_time.second % 60;
cout << minute1 << ":" << second1 << "\n";
cout << minute2 << ":" << second2 << "\n";
return 0;
}
- 뭔가 벌어질 수 있는 모든 경우의 수를 고려하며 풀이해보려다가 실패했다
- 개 노가다로 풀이하다가 더위먹음
# 모범 답안
#include<bits/stdc++.h>
using namespace std;
int n, A, B, bsum, asum, o;
string s, previous;
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);
}
int changeToInt(string a){
return atoi(a.substr(0, 2).c_str()) * 60 + atoi(a.substr(3, 2).c_str());
}
void go(int &sum, string s){
sum += (changeToInt(s) - changeToInt(previous));
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
for (int i = 0; i < n; i++){
cin >> o >> s;
if(A > B){
go(asum, s);
}else if(B > A){
go(bsum, s);
}
o == 1 ? A++ : B++;
previous = s;
}
if(A > B){
go(asum, "48:00");
}else if(B > A){
go(bsum, "48:00");
}
cout << print(asum) << "\n";
cout << print(bsum) << "\n";
return 0;
}
- print함수에서 첫 두개에 "00"을 더해줘서 일의자리수를
07
형태로 표현할 수 있는 팁 - previous 적극 활용
- 첫 골 여부는 그냥 if문에서 함수 호출하지 않도록 구현
- 함수 짜서 구현하자..
# 복습
#include<bits/stdc++.h>
using namespace std;
int n, sc1, sc2, prev1, prev2, winning = 0, prevGoal;
string getTime(int t){
string minute = "00" + to_string(t / 60);
string second = "00" + to_string(t % 60);
return minute.substr(minute.size() - 2, 2) + ":" + second.substr(second.size() - 2, 2);
}
void getScore(int sc, string s){
if(sc == 1){
sc1++;
}else if(sc == 2){
sc2++;
}
string minute = s.substr(0, 2);
string second = s.substr(3, 2);
int time = atoi(minute.c_str()) * 60 + atoi(second.c_str());
if(winning == 1){
prev1 += time - prevGoal;
}else if(winning == 2){
prev2 += time - prevGoal;
}
if(sc1 == sc2){
winning = 0;
}else if(sc1 > sc2){
winning = 1;
}else{
winning = 2;
}
prevGoal = time;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
for (int i = 0; i < n; i++){
int sc;
string temp;
cin >> sc;
cin >> temp;
getScore(sc, temp);
}
getScore(0, "48:00");
cout << getTime(prev1) << "\n";
cout << getTime(prev2) << "\n";
return 0;
}
- 이기고 있었던 팀이 어떤 팀인지만 알면 된다.
- 골을 상대가 넣어서 동점이 되었더라도, 해당 경우는 이미 이기고 있었던 경우이므로 역시나 이기고 있던 시간이 동일하게 누적된다.
- 골을 넣어서 역전한 경우, 마지막에 골을 넣었던 때 부터 현재 골을 넣은 시간까지의 간격은 여전히 동점이었으므로 이기고 있던 시간에 포함되지 않는다.