https://www.acmicpc.net/problem/2852
2852번: NBA 농구
첫째 줄에 골이 들어간 횟수 N(1<=N<=100)이 주어진다. 둘째 줄부터 N개의 줄에 득점 정보가 주어진다. 득점 정보는 득점한 팀의 번호와 득점한 시간으로 이루어져 있다. 팀 번호는 1 또는 2이다. 득
www.acmicpc.net
스위핑 느낌으로 순회하면서 풀었다.
$diff_t$ 에 시간 $t$ 별 점수 변화량을 저장했는데,
편의상 + 누가이기고있는지 보기 명확하기때문에
1번 팀이 득점한 경우에는 $diff_t$ 를 1 증가시키고
2번 팀이 득점한 경우에는 $diff_t$ 를 1 감소시켰다.
시간은 일괄적으로 초로 환산해서 계산하였고,
48분은 환산하면 2880초밖에 되지 않기때문에
반복문을 통해서 모든 시간대를 한번씩 훑으면서
누가 이기고 있는지를 $now$에 저장시켰다.
앞선 $diff_t$를 $[0,k]$ 구간에서 전부 더해서
$now$ 를 만들 수 있는데, 이는 현재 시간이 $K$일때
$now$의 값이 양수라면 1번 팀이 이기고 있음을,
$now$의 값이 음수라면 2번 팀이 이기고 있음을 의미한다.
입출력 형식을 지켜줘야하기 때문에 cin / cout이 아니라
scanf / printf 로 입출력을 해줬다.
#include <bits/stdc++.h>
using namespace std;
int diff[3456] = {0};
int main(){
int N,a,b,c;
scanf("%d", &N);
for(int i=0; i<N; i++){
scanf("%d %d:%d", &a, &b, &c);
int time = b*60+c;
if(a==1) diff[time]++;
if(a==2) diff[time]--;
}
int team1 = 0;
int team2 = 0;
int now = 0;
for(int i=0; i<2880; i++){
now += diff[i];
if(now > 0) team1++;
if(now < 0) team2++;
}
printf("%02d:%02d\n", team1/60, team1%60);
printf("%02d:%02d\n", team2/60, team2%60);
return 0;
}
반응형