[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; } }
댓글
댓글 쓰기