Machineboy空

2852 : NBA 농구 - substr, prev, temp 본문

Computer/Coding Test

2852 : NBA 농구 - substr, prev, temp

안녕도라 2024. 2. 20. 14:48

https://www.acmicpc.net/problem/2852

 

2852번: NBA 농구

첫째 줄에 골이 들어간 횟수 N(1<=N<=100)이 주어진다. 둘째 줄부터 N개의 줄에 득점 정보가 주어진다. 득점 정보는 득점한 팀의 번호와 득점한 시간으로 이루어져 있다. 팀 번호는 1 또는 2이다. 득

www.acmicpc.net

문제요약

경기 진행에 따라 이기고 있는 팀 시간 구하기.

 

난이도

Silver 3


풀이 포인트

  • prev temp의 활용
  • 시간 표기 
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);
}

REVIEW

 

날 굉장히 속 썩인 문제.

간단한 거 같은데 계속 잡히지 않아 답답했다.

 

이긴 시간을 갱신하는 포인트가 점수가 능가했을 때가 아닌 무승부가 되는 시점이라는 것이 중요.

  • 무승부가 된 시점
    • 현재 골을 넣은 팀 - 이기고 있던 팀
    • 이전 골 넣은 시간 갱신
  • 역전된 시점에 이기고 있는 팀 갱신 

아직도 경우의 수 빈틈없이 완성하지 못했나보다.

 

우선 모범 풀이에서는

  • 골이 들어간 시점 모든 구간 마다, 이긴 사람에게 그 구간을 더해주는 sum의 형식으로 구현했다.
  • 나는 그 구간을 승부가 바뀐 시점에만 더해주고자 했다..

 

굉장히 직관적으로 풀이했다고 생각했는데 일단은 좀 더 두고 왜 틀렸는지 분석해봐야겠다.

뭔가 자료 구조라거나, 다른 이론적 지식이 없어서가 아니라 이런 아이디어적인 문제들..

쉬워보이는 게 안풀리면 좀 열받음. 알려줄 사람 환영.


CODE

#include <bits/stdc++.h>
using namespace std;

#define prev aaa

int n, o, A, B, asum, bsum;
string s, 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);
}
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(prev));
}
int main()
{
    ios_base::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++;
        prev = s;
    }
    if (A > B)
        go(asum, "48:00");
    else if (B > A)
        go(bsum, "48:00");
    cout << print(asum) << "\n";
    cout << print(bsum) << "\n";
}
//왜 틀린지 분석중
#include <bits/stdc++.h>
using namespace std;

int n, teamN, otherN, minute, second, winN = -1;
string timeS;
bool isSame;

int prevGoalTime;
map<int, int> goalCntMap; // team, goalcnt
map<int, int> winTimeMap; // team, winTime

string formatTime(int min, int sec){
    ostringstream oss;
    oss << setfill('0') << setw(2) << min <<":" << setw(2) << sec;
    return oss.str();
}


int main()
{

    cin >> n;

    for (int i = 0; i < n; i++)
    {
        cin >> teamN;
        cin >> timeS;

        goalCntMap[teamN]++;
        minute = stoi(timeS.substr(0, 2));
        second = stoi(timeS.substr(3, 2));


        if (teamN == 1)
            otherN = 2;
        else
            otherN = 1;

        if (winN != teamN && goalCntMap[teamN] > goalCntMap[otherN])
        {            
            prevGoalTime = minute * 60 + second;
            winN = teamN;
        }
        else if (winN != teamN && goalCntMap[teamN]  == goalCntMap[otherN]){

            winTimeMap[winN] += (minute * 60 + second) - prevGoalTime;
            prevGoalTime = minute * 60 + second;
        }
    }

    winTimeMap[winN] += 48 * 60 - prevGoalTime;

    //숫자 표기


    cout << formatTime(winTimeMap[1]/60, winTimeMap[1]%60) << '\n';
    cout << formatTime(winTimeMap[2] / 60, winTimeMap[2] % 60) << '\n';
}