Koder / 박성훈
article thumbnail

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;
}

 

반응형