[백준] 2852, scanf 출력 문자열 포맷팅, 시간 계

YUN·2026년 3월 14일

C++

목록 보기
71/85

업로드중..업로드중..

1팀 VS 2팀 경기의 득점 정보를 입력받고, 이를 기반으로 각 팀이 몇분, 몇초 동안 승리를 유지하고 있었는지를 출력하는 문제이다.

이 문제의 포인트는 3가지이다.

(1) scnaf()로 시간, 분 나누어 입력받기
(2) 분:초 형식의 시간 계산시 분*60+초 로 가장 작은 단위로 통일하여 계산하기
(3) %02d 형식지정자를 활용해서 2자리 분:2자리 초 형식으로 출력하기

위의 포인트를 잘 알고있으면 문제를 쉽게 풀 수 있다.

1. 풀이

 #include <bits/stdc++.h>

using namespace std;
int cnt_1; // 1
int cnt_2; // 2
int time_1;
int time_2;

int main() {
    int n,t, m, s; 
    scanf("%d", &n); //3
    int prev_time = -1 ;
    while(n--) {
        
        scanf("%d %d:%d", &t, &m, &s);
        int curr_time = 60*m+s;
        if(prev_time != -1 && cnt_1 != cnt_2) {
           int diff_time = curr_time-prev_time;
           if(cnt_1 > cnt_2) time_1+=diff_time;
            else time_2+=diff_time;
        }
        if(t==1) cnt_1++; 
        else cnt_2++;
        prev_time = curr_time; // 31:30
    }
    if(cnt_1!=cnt_2) (cnt_1 > cnt_2) ? time_1+=48*60-prev_time : time_2+=48*60-prev_time;
    //cout << get_time_out(time_1) << '\n' << get_time_out(time_2);
    printf("%02d:%02d\n%02d:%02d", time_1/60, time_1%60, time_2/60, time_2%60);
    
    return 0;
}

2. 오답 노트

(1) scanf() 사용할 생각을 못했다.

문제와 같이 입력,출력 조건이 까다롭고, string으로 받아서 parsing하기 번거로운 경우에는 scanf()를 적절한 형식 지정자와 함께 사용하는것이 훨씬 편하다.

(2) 시간이 2가지 단위의 혼합(분:초)으로 주어질 경우 가장 작은, 초 단위로 통일하자

이 문제에서는 시간이분:초(2가지 단위의 혼합)로 주어진다. 이런 경우 계산의 편리성을 위하여 로 시간의 단위를 통일하고 전부 계산한 다음에 나머지 연산, 모듈러 연산을 통해 값을 출력하는 것이 효율적이다.

profile
안녕하세요. 전자공학부 학부생의 공부 기록입니다.

0개의 댓글