문제
정답 코드
#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
'알고리즘 > 백준-실버' 카테고리의 다른 글
백준 9012번 괄호 (C++) (스택활용) (0) | 2023.01.08 |
---|---|
백준 1436번 영화감독 숌(C++) (0) | 2023.01.07 |
백준 3474번 교수가 된 현우(C++) (0) | 2023.01.07 |
백준 10709번 기상캐스터(C++) (0) | 2023.01.06 |
백준 2870번 수학숙제(overflow주의)(C++) (0) | 2023.01.06 |