[알고리즘] 2852번: NBA 농구

2023. 9. 16. 00:53Algorithm/with C++

0. 문제

 

 

2852번: NBA 농구

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

www.acmicpc.net

 


1. 문제 이해

 

 

  1. 득점이 발생한다.
  2. 동점인지 확인한다.
    1. 동점이면 prevTime을 현재 시간으로 갱신한다.
    2. 동점이 아니면 높은 스코어의 팀에 시간을 추가하고, prevTime을 현재 시간으로 갱신한다.
  3. 득점한 팀의 스코어를 올린다.
  4. 마지막에 48:00에 2번을 추가적으로 수행한다.

 


2. 제출

// 백준 2852번: NBA 농구
#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;

int N, score1=0, score2=0, t1=0, t2=0, prevTime=0, now=0;

string print(int sec){
  string ret="", MM="00", SS="00";

  MM+= to_string(sec/60);
  SS+= to_string(sec%60);

  MM= MM.substr(MM.size()-2, 2);
  SS= SS.substr(SS.size()-2, 2);

  ret+=MM; ret+=":"; ret+=SS;
  return ret;
}

int parse(string MMSS){
  int MM = atoi(MMSS.substr(0,2).c_str());
  int SS = atoi(MMSS.substr(3,2).c_str());
  return (MM*60)+SS;
}

int main(){
  ios_base::sync_with_stdio(false);
  cin.tie(NULL); cout.tie(NULL);

  cin >> N;
  for(int i=0; i<N; i++){
    int tNum; string input;
    cin >> tNum >> input;
    now = parse(input);

    if(score1>score2){
      t1 += now - prevTime;
    }else if(score1<score2){
      t2 += now - prevTime;
    }
    prevTime = now;

    if(tNum==1)score1++;
    else score2++;
  }
  // 48:00 = 2880
  if(score1>score2){
    t1 += 2880 - prevTime;
  }else if(score1<score2){
    t2 += 2880 - prevTime;
  }

  cout << print(t1) << "\n";
  cout << print(t2) << "\n";

  return 0;
}
  • int parse(string MMSS){…}
    : MM:SS와 같이 입력값이 주어지는 경우 하나의 단위로 통일한다. 분을 초로 변환한다.

이와 같이 여러 단위(ex. 시, 분, 초)로 주어질 경우 하나의 단위로 변환한다.

 

string print(int sec){
  string ret="", MM="00", SS="00";

  MM+= to_string(sec/60);
  SS+= to_string(sec%60);

  MM= MM.substr(MM.size()-2, 2);
  SS= SS.substr(SS.size()-2, 2);

  ret+=MM; ret+=":"; ret+=SS;
  return ret;
}

만약 MM이나 SS가 한 자리 수라면 앞에 0을 붙이는 방법이다.

 

일정한 포맷을 구현하는 방법이니 기억해 둘 것.

 


 

항상 시작은 문제의 규칙성을 찾고 검증하기 위해서
직접 손으로 적어보자.