알고리즘/백준-실버

백준 2852번 NBA 농구(C++)

뜨거운 개발자 2023. 1. 7. 00:27

문제

정답 코드

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

using namespace std;
string bef_time;

string make_ret_time(string ret, string bef,string now)
{
	char arr[6];
	arr[0] = now[0] -bef[0] + '0';
	arr[1] = now[1] - bef[1] + '0';
	arr[2] = ':';
	arr[3] = now[3] - bef[3] + '0';
	arr[4] = now[4] -bef[4] + '0';
	if (arr[4] <'0')
	{
		arr[4] = arr[4] + 10;
		arr[3]--;
	}
	if (arr[3] < '0')
	{
		arr[3] = arr[3] + 6;
		arr[1]--;
	}
	if (arr[1] < '0')
	{
		arr[0]--;
		arr[1]= arr[1] + 10;
	}
	if ('9'< arr[4])
	{
		arr[4] = arr[4] - 10;
		arr[3]++;
	}
	if ('5'<arr[3])
	{
		arr[3] = arr[3] - 6;
		arr[1]++;
	}
	if ('9' < arr[1])
	{
		arr[1] = arr[1] - 10;
		arr[0]++;
	}
	arr[5] = '\0';
	arr[0] = arr[0]  + ret[0] - '0';
	arr[1] = arr[1] + ret[1] - '0';
	arr[2] = ':';
	arr[3] = arr[3] + ret[3] - '0';
	arr[4] = arr[4] + ret[4] - '0';
	if (arr[4] <'0')
	{
		arr[4] = arr[4] + 10;
		arr[3]--;
	}
	if (arr[3] < '0')
	{
		arr[3] = arr[3] + 6;
		arr[1]--;
	}
	if (arr[1] < '0')
	{
		arr[0]--;
		arr[1]= arr[1] + 10;
	}
	if ('9'< arr[4])
	{
		arr[4] = arr[4] - 10;
		arr[3]++;
	}
	if ('5'<arr[3])
	{
		arr[3] = arr[3] - 6;
		arr[1]++;
	}
	if ('9' < arr[1])
	{
		arr[1] = arr[1] - 10;
		arr[0]++;
	}
	return (arr);
}

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n;
	cin >> n;
	int first_score =0;
	int second_score = 0;
	int now_win = -1;
	string ret1,ret2;
	ret1 = "00:00";
	ret2 ="00:00";
	for (int i=0;i < n;i++)
	{
		int input_num;
		string time;
		cin >> input_num >> time;
		if (input_num == 1)
			first_score++;
		else
			second_score++;
		if (first_score > second_score)
		{
			if (now_win == -1)
				bef_time = time;
			now_win = 1;
		}
		else if (first_score < second_score)
		{
			if (now_win == -1)
				bef_time = time;
			now_win = 2;
		}
		else //fist_score == second_score
		{
			if (now_win == 1)
				ret1 = make_ret_time(ret1,bef_time,time);
			else if (now_win == 2)
				ret2 = make_ret_time(ret2,bef_time,time);
			now_win = -1;
		}
		// cout <<"ret1 :" <<ret1 <<"ret2 : "<<ret2  << "bef: " << bef_time<< "\n";
	}
	if (now_win == 1)
		ret1 = make_ret_time(ret1,bef_time,"48:00");
	else if (now_win == 2)
		ret2 = make_ret_time(ret2,bef_time,"48:00");
	cout << ret1 << "\n" <<  ret2 << "\n";

}

문제 풀이의 흐름

허허 이 문제는 string을 다루는게 익숙하지 않고 은근히 신경쓸게 많아서 많이 헷갈렸다.

흐름은 간단하다.

상태는 3가지로 구분한다.

  • 1팀이나 2팀이 이기고 있다가 무승부가 되는 경우
  • 무승부인 상태에서 1,2팀이 득점한 경우
  • 마지막에 마치는 경우

크게 이렇게 3가지 경우를 다 처리를 해야만 한다.

첫번째 상황의 경우 우리는 이기고 있던 시간을 기록한다.

두번째 상황의 경우 우리는 이 시간부터 이기기 시작했다고 기록을 시작한다.

세번째 상황의 경우 마지막으로 이기고 있던 팀이 끝나는 시간까지 기록을 갱신한다.

주의 할 점

이 문제는 시간이라는 특수성이 있어서 자릿수를 올림하는 것이나, 60분까지 있다는 사실을 헷갈리는 순간 꽤나 어려운 문제로 변할 수있다.

따라서 60분을 잘 했는지 조건 식을 잘 세웠는지 잘 확인 해볼 필요가 있다.

반성 및 고찰

코드가 매우 더럽다..

내가 substr함수를 잘 사용하지 못해서 아무래도 생기는 문제이긴 하다.

앞으로는 substr 함수를 사용해서 쓸때없는 메모리 복사를 줄여나가야 겠다.


Uploaded by N2T

728x90