Programing/백준, 프로그래머스(C++)

[C++][백준 2852] NBA 농구

hye3193 2025. 1. 17. 20:24

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

 

제출 코드

#include <iostream>
#include <iomanip>
#include <string>
using namespace std;

int score[2];
int t[2];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int n, team, prev = 0;
    string str;
    cin >> n;
    while(n--)
    {
        cin >> team >> str;
        int time = stoi(str.substr(0, 2)) * 60 + stoi(str.substr(3, 2));
        if (score[0] != score[1])
            (score[0] > score[1] ? t[0] : t[1]) += time - prev;
        score[team - 1]++;
        prev = time;
    }
    if (score[0] != score[1])
        (score[0] > score[1] ? t[0] : t[1]) += 2880 - prev;
    
    cout << setw(2) << setfill('0') << t[0] / 60 << ":";
    cout << setw(2) << t[0] % 60 << '\n';
    cout << setw(2) << t[1] / 60 << ":";
    cout << setw(2) << t[1] % 60 << '\n';
}

MM:SS 형태로 입력받은 시간을 int 형태의 초로 바꾸여 계산에 사용하였고, 마지막에 출력할 때 다시 형식을 바꿔주는 식으로 코드를 작성하였다

 

시간을 출력할 때 무조건 MM:SS와 같이 분과 초의 길이가 2가 되어야 해서 포맷팅에 대해 찾아보았다

 

물론 c언어의 printf를 이용해 printf("%02d", time) 이런 식으로 출력시키면 00 05 10 이런 식으로 길이 2에 맞게 포맷팅되지만, 시간 절약을 위해 ios::sync_with_stdio(false); 설정을 해뒀다면 C언어의 입출력을 사용할 수 없다

(해당 문제는 시간을 크게 신경써야 하는 문제가 아니라 c언어의 출력을 사용하기 위해 동기화 설정을 빼도 상관없긴 하다)

 

C++에서의 cout 포맷팅을 위해서 헤더 파일 #include <iomanip>를 추가해주어야 한다

std::setw(지정할 길이)로 2만큼의 길이를 지정해주고

std::setfill(채울 문자)로 앞에 0을 채우라고 지정해주면 된다

 

이때 setfill은 한 번 지정해두면 뒤에 오는 cout들에서도 적용이 되지만, setw는 매번 지정해주어야 한다(그래서 뒤에 ":"등을 출력할 때 그냥 출력시켜도 앞에 0을 붙이는 등의 현상이 발생하지 않는다)

 

만약 setfill을 다시 초기화시키고 싶다면 setfill('')로 설정해 주면 된다