Post List

[BOJ] 백준 2852 NBA 농구

[BOJ] 2852 NBA 농구



문제 링크 : https://www.acmicpc.net/problem/2852


각 팀이 이기고 있었던 시간을 출력하는 문제 입니다.
이기고 있었던 시간의 기준은 다음과 같습니다 :


1. 서로 동점이었다가, 한 팀이 균형을 깨고 역전했을때 부터 동점or경기종료.
2. 한번 점수 넘은 상대를 대상으로 계속 골을 넣어도 맨 처음 역전한 순간부터 시간 카운트.
3. 이기고 있다가 역전당하면 그 순간 이기고있던 시간 종료.


위 세가지 규칙만 이해한다면 쉽게 풀 수 있는 문제 입니다.




소스 코드 :

#include 
#include 
#include 
using namespace std;


int main() {
 int t; cin >> t; cin.ignore();
 int A = 0, B = 0; // A, B팀 스코어.
 int time[2] = { 0,0 };  // 최종 출력할 변수
 int tempTime[2] = { 0,0 };  // 임시 계산을 위해 선언한 변수(for문 밖에 선언해야 함)
 int which = 0;  // 현재 어떤팀이 이기고있는지 알려주는 변수
 for (int i = 0; i < t; i++) {
  int team; cin >> team;// 어느팀이 골을 넣었는지 
  string s; getline(cin, s);
  int qw = s.find(':');
  int timetransfer = stoi(s.substr(0, qw)) * 60 + stoi(s.substr(qw + 1, s.length() - qw - 1)); // 초로 변환
  if (team == 1) A++;
  else B++;
  if (A > B) {
   if (A - B <= 1 && which != 1) {
    // 방금 막 역전했을경우(이기고있는 팀이 A가 아닐때)
    tempTime[0] = timetransfer;
   }
   else {
    // 원래 이기고 있을 경우 아무것도 안함
   }
  }
  else if (A < B) { // B가 앞서나갈경우
   if (B - A <= 1 && which != 2) {
    // 방금 막 역전했을경우( 이기고있는 팀이 B가 아닐때)
    tempTime[1] = timetransfer;

   }
   else {
    // 원래 이기고있던 상태일 경우
    // 아무것도 안함.
   }
  }
  else { // 비기게 되었을 때
   if (team == 1) // A팀이 방금 골넣어서 동점 만들었을 경우
   {
    // 2팀의 시간 기록은 멈춤
    time[1] += timetransfer - tempTime[1];
   }
   else {
    // 1팀의 시간기록은 멈춤
    time[0] += timetransfer - tempTime[0];
   }
  }

  // 현재 어떤팀이 이기고 있나 판단.
  if (A > B) which = 1;
  else if (A < B) which = 2;
  else which = 0;

  // 경기 종료시 특정 팀이 이기고 있을 때
  if (i == t - 1) {
   if (which == 1) {
    time[0] = time[0] + 47 * 60 + 60 - tempTime[0];
   }
   else if (which == 2) {
    time[1] = time[1] + 48 * 60 - tempTime[1];
   }
  }

 }
 for (int i = 0; i <= 1; i++) {
  if (time[i] / 60 < 10) {
   cout << '0';
  }
  cout << time[i] / 60 << ":";
  if (time[i] % 60 < 10) {
   cout << '0';
  }
  cout << time[i] % 60 << endl;

 }



}

댓글