[BAEKJOON] 백준 2852: NBA 농구 (C#)

2024. 10. 15. 13:56IT/BaekJoon

문제 링크

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)으로 출력한다.

 

 

 

통과한 답안

namespace _2852
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int N = int.Parse(Console.ReadLine());
            int team1Score = 0;
            int team2Score = 0;
            int leadTeam = 0;
            int team1Time = 0;
            int team2Time = 0;
            int lastMin = 0;
            int lastSec = 0;

            for (int i = 0; i < N; i++)
            {
                string[] inputs = Console.ReadLine().Split(' ');
                int team = int.Parse(inputs[0]);
                string[] times = inputs[1].Split(":");
                int curMin = int.Parse(times[0]);
                int curSec = int.Parse(times[1]);

                int elapsedTime = (curMin -lastMin) * 60 + (curSec - lastSec);

                if (leadTeam == 1)
                {
                    team1Time += elapsedTime;
                }
                else if (leadTeam == 2)
                {
                    team2Time += elapsedTime;
                }

                if (team == 1) team1Score++;
                else team2Score++;

                if (team1Score > team2Score) leadTeam = 1;
                else if (team1Score == team2Score) leadTeam = 0;
                else leadTeam = 2;

                lastMin = curMin;
                lastSec = curSec;
            }

            int finalTime = (48 - lastMin) * 60 - lastSec;
            if (leadTeam == 1)
            {
                team1Time += finalTime;
            }
            else if (leadTeam == 2)
            {
                team2Time += finalTime;
            }

            Console.WriteLine($"{(team1Time / 60).ToString("D2")}:{(team1Time % 60).ToString("D2")}");
            Console.WriteLine($"{(team2Time / 60).ToString("D2")}:{(team2Time % 60).ToString("D2")}");
        }
    }
}

 

N개의 득점 정보(특점 팀, 특점 시간)가 주어졌을 때,

1번 팀과 2번 팀이 이기고 있던 시간을 계산해서 출력하는 문제이다.

 

시간을 분과 초로 나타내야되기 때문에 주어진 정보의 시간을 모두 초로 계산한 뒤에

마지막에 60으로 나눈 몫을 분으로, 나머지를 초로 변환하는 방법을 사용하였다.

 

또, 각 팀의 득점에 따라서 리드하는 팀이 달라지므로, 현재 리드하는 팀의 정보를 저장하고

이에 따라서 주어진 사이 시간을 리드하는 팀에 더하도록 구현하였으며

마지막으로 득점한 시간과 종료 시간(48:00)의 사이 시간도 처리하는 것으로 해결하였다.