C++ / 2852 / NBA 농구 ( 문자열 )

https://www.acmicpc.net/problem/2852

문제 요약

동혁이는 NBA 농구 경기를 즐겨 본다. 동혁이는 골이 들어갈 때 마다 골이 들어간 시간과 팀을 적는 이상한 취미를 가지고 있다.

농구 경기는 정확히 48분동안 진행된다. 각 팀이 몇 분동안 이기고 있었는지 출력하는 프로그램을 작성하시오.

 

첫째 줄에 골이 들어간 횟수 N(1<=N<=100)이 주어진다. 둘째 줄부터 N개의 줄에 득점 정보가 주어진다. 득점 정보는 득점한 팀의 번호와 득점한 시간으로 이루어져 있다. 팀 번호는 1 또는 2이다. 득점한 시간은 MM:SS(분:초) 형식이며, 분과 초가 한자리 일 경우 첫째자리가 0이다. 분은 0보다 크거나 같고, 47보다 작거나 같으며, 초는 0보다 크거나 같고, 59보다 작거나 같다. 득점 시간이 겹치는 경우는 없다.

문제 풀이

1. 구조체를 만듭니다. 구조체를 만드는 이유는 골 넣은 팀, 골 넣은 분, 골 넣은 초 이 3개의 변수를 효율적으로 사용하기 위함입니다. 이기는 팀을 구분하기 위해 각각 점수 변수를 만들고, 이기고 있는 시간을 담을 변수를 만듭니다.

2. 구조체를 벡터에 넣어 구조체 배열을 만듭니다.

3. 입력을 받는데 먼저 int로 골넣은 팀을 받고 그 다음 string으로 골 넣은 분과 초를 입력받습니다.

4. 입력받은 문자열을 앞에 2개 ( 분 ) 제일  끝에 2개 ( 초, 가운데는 ' : ' 임 )로 쪼개서 구조체에 int로 파싱하여 넣습니다.

5. 구현 함수에서는 분을 세는변수와 초를 세는변수를 초기값 -1로주고 배열 인덱스를 세어줄 변수를 0으로 주어 while문을 돌립니다. while문의 조건은 분을 세는 변수가 47과 같거나 작을때 까지입니다.

6. while문에서는 분이 47 초가 59가 되면 반환합니다. 그리고 매 회차마다 초를 증가시키는데 초가 60이 되면 분을 증가시키고 초를 0으로 초기화 합니다.

7. 현재 구조체 배열의 인덱스의 문과 초가 현제 분과 초랑 일치하면 골 넣은 팀의 점수를 추가합니다.

8. 점수가 더 큰쪽이 이기고 있게 하고 인덱스 번호를 증가시킵니다.

9. 각 이기고 있는 팀의 시간의 초를 증가시키고 그 초가 60이 되면 초를 초기화하고 분을 증가 시킵니다.

10. 메인으로 돌아와서 각 팀별로 이기고 있던 시간을 문자열로 파싱하여 출력합니다.

주의할 점

정답을 문자열로 바꾸지 않고 출력하면 틀립니다.

구현 함수에서 while문 조건을 47과 같을때 까지만 돌아가게 해야합니다.

코드

#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;

int n, aWinmm = 0, aWinss = 0, bWinmm = 0, bWinss = 0, nowWin = 0;
int ascore = 0, bscore = 0;

// 골 넣은 팀, 골 넣은 분, 골 넣은 초
struct NBA {
	int t;
	int m;
	int s;
};
vector<NBA>v;

void go()
{
	int mm = -1, ss = -1;
	int i = 0;
	while (mm <= 47)
	{
		// 게임시간이 끝나면 반환
		if (mm == 47 && ss == 59)
		{
			return;
		}
		// 초가 60이되면 분 증가
		ss++;
		if (ss == 60)
		{
			ss = 0;
			mm++;
		}

		// 구조체 i번째 골넣은 분과 초가 현재 분과 초랑 일치하면
		if (v[i].m == mm && v[i].s == ss)
		{
			// 골 넣은 팀 점수 추가
			if (v[i].t == 1)
			{
				ascore++;
			}
			else
			{
				bscore++;
			}

			// 점수가 더 큰 쪽이 이기고 있게 함
			if (ascore > bscore)
			{
				nowWin = 1;
			}
			else if (bscore > ascore)
			{
				nowWin = 2;
			}
			else
			{
				nowWin = 0;
			}
			// 다음 골넣은 순서로  진행
			if (i < n - 1)
			{
				i++;
			}

		}
		// a팀이 이기고 있으면 a팀 이기고 있는 시간 증가
		if (nowWin == 1)
		{
			// a팀의 초가  60이 되면 분증가
			aWinss++;
			if (aWinss == 60)
			{
				aWinss = 0;
				aWinmm++;
			}

		} // b팀도 마찬가지
		else if (nowWin == 2)
		{
			bWinss++;
			if (bWinss == 60)
			{
				bWinss = 0;
				bWinmm++;
			}

		}
		else
		{

		}


	}
}

int main()
{
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		// 골 넣은 팀
		int a;
		cin >> a;

		// 골 넣은 분 초
		string s;
		cin >> s;


		string s1;
		string s2;
		s2.resize(2);

		// 골 넣은 분 담기
		s1 = to_string(s[0] - '0') + to_string(s[1] - '0');
		// 골 넣은 초 담기
		s2[0] = s[3];
		s2[1] = s[4];
		// 구조체에 넣기
		v.push_back({ a, stoi(s1), stoi(s2) });
	}

	// 구현 함수
	go();


	// 문자열로 안바꿔서 출력하면 틀림
	// a팀 이기고 있던시간 b 팀이기고 있던 시간 담을 변수
	string ams, bms;
	// 10의 자리 분
	ams.push_back(aWinmm / 10 + '0');
	// 1의 자리 분
	ams.push_back(aWinmm % 10 + '0');
	ams.push_back(':');
	// 10의 자리 초
	ams.push_back(aWinss / 10 + '0');
	// 1의 자리 초
	ams.push_back(aWinss % 10 + '0');

	bms.push_back(bWinmm / 10 + '0');
	bms.push_back(bWinmm % 10 + '0');
	bms.push_back(':');
	bms.push_back(bWinss / 10 + '0');
	bms.push_back(bWinss % 10 + '0');

	cout << ams << "\n" << bms;
	return 0;
}

예제 1

1
1 20:00

결과 1

etc-image-0

예제 2

3
1 01:10
2 21:10
2 31:30

결과 2

etc-image-1

예제 3

5
1 01:10
1 02:20
2 45:30
2 46:40
2 47:50

결과 3

etc-image-2

'BAEKJOON > String' 카테고리의 다른 글

C++ / 1652 / 누울 자리를 찾아라 ( 문자열 )  (0) 2024.11.25
C++ / 10798 / 세로읽기 ( 문자열 )  (0) 2024.11.04