# 본인 풀이

#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;
}
  1. 뭔가 벌어질 수 있는 모든 경우의 수를 고려하며 풀이해보려다가 실패했다
  2. 개 노가다로 풀이하다가 더위먹음

# 모범 답안

#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;
}
  1. print함수에서 첫 두개에 "00"을 더해줘서 일의자리수를 07 형태로 표현할 수 있는 팁
  2. previous 적극 활용
  3. 첫 골 여부는 그냥 if문에서 함수 호출하지 않도록 구현
  4. 함수 짜서 구현하자..

# 복습

#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;
}
  1. 이기고 있었던 팀이 어떤 팀인지만 알면 된다.
  2. 골을 상대가 넣어서 동점이 되었더라도, 해당 경우는 이미 이기고 있었던 경우이므로 역시나 이기고 있던 시간이 동일하게 누적된다.
  3. 골을 넣어서 역전한 경우, 마지막에 골을 넣었던 때 부터 현재 골을 넣은 시간까지의 간격은 여전히 동점이었으므로 이기고 있던 시간에 포함되지 않는다.