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('')로 설정해 주면 된다