와드의 블로그

2852번: NBA 농구 본문

PS/B.O.J

2852번: NBA 농구

Ward 2026. 3. 23. 12:04

문제

농구 경기는 48분 동안 진행됩니다. 각 팀이 득점한 시간과 팀 번호가 주어질 때, 1번 팀이 이기고 있던 시간과 2번 팀이 이기고 있던 시간을 출력하는 문제입니다.

  • 입력: 첫째 줄에 골이 들어간 횟수 N (1 ≤ N ≤ 100)이 주어집니다. 둘째 줄부터 N개의 줄에 득점한 팀의 번호(1 또는 2)와 득점 시간(MM:SS 형식)이 주어집니다.
  • 출력: 첫째 줄에 1번 팀이 이기고 있던 시간, 둘째 줄에 2번 팀이 이기고 있던 시간을 "MM:SS" 형식으로 출력합니다.

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

풀이

시간을 모두 초(second) 단위로 변환하여 계산하고, 출력 시에 다시 지정된 문자열 포맷으로 변환하는 것이 핵심인 시뮬레이션 문제입니다.

  1. 시간 변환 메서드:
    • timeToSec: "MM:SS" 형식의 문자열을 받아 분에 60을 곱하고 초를 더해 총 '초' 단위의 정수로 변환합니다.
    • secToTimeFormat: 누적된 총 초(sec)를 다시 "MM:SS" 형식의 문자열로 변환합니다. String.format("%02d:%02d", m, s)를 사용하여 항상 두 자리 숫자로 맞춰줍니다.
  2. 득점 시점마다 시간 누적:
    • 득점이 발생할 때마다, 직전 득점 시각(prev)부터 현재 득점 시각(time)까지 어느 팀이 이기고 있었는지 점수(score1, score2)를 비교합니다.
    • score1 > score2라면 1번 팀의 누적 시간(winningTime1)에 time - prev를 더합니다.
    • score1 < score2라면 2번 팀의 누적 시간(winningTime2)에 time - prev를 더합니다. (동점일 때는 어느 팀의 시간도 늘어나지 않습니다.)
    • 시간 누적을 마친 뒤, 이번에 득점한 팀의 점수를 1 올리고 prev를 현재 득점 시간으로 갱신합니다.
  3. 경기 종료 처리:
    • 모든 득점 기록을 처리한 후, 마지막 득점 시점(prev)부터 경기 종료 시점인 "48:00"까지 이기고 있던 팀의 시간을 마지막으로 한 번 더 누적해 주어야 합니다.

코드

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
       BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

       int n = Integer.parseInt(br.readLine());

       int score1 = 0, score2 = 0;
       int winningTime1 = 0, winningTime2 = 0;

       int prev = 0;
       while (n-- > 0) {
          StringTokenizer st = new StringTokenizer(br.readLine());
          int team = Integer.parseInt(st.nextToken());
          int time = timeToSec(st.nextToken());

          // 이전 득점 시간부터 현재 득점 시간까지 이기고 있던 팀의 시간 누적
          if (score1 > score2) {
             winningTime1 += time - prev;
          } else if (score1 < score2) {
             winningTime2 += time - prev;
          }

          // 득점 처리 및 이전 시간 갱신
          if (team == 1) {
             score1++;
          } else {
             score2++;
          }
          prev = time;
       }

       // 마지막 득점 시점부터 경기 종료(48:00)까지의 시간 누적
       if (score1 > score2) {
          winningTime1 += timeToSec("48:00") - prev;
       } else if (score1 < score2) {
          winningTime2 += timeToSec("48:00") - prev;
       }

       bw.write(secToTimeFormat(winningTime1) + "\n" + secToTimeFormat(winningTime2));

       bw.flush();
       bw.close();
       br.close();
    }

    // "MM:SS" 문자열을 초(second) 단위 정수로 변환
    static int timeToSec(String timeStr) {
       int m = Integer.parseInt(timeStr.substring(0, 2));
       int s = Integer.parseInt(timeStr.substring(3));

       return m * 60 + s;
    }

    // 초(second) 단위 정수를 "MM:SS" 포맷의 문자열로 변환
    static String secToTimeFormat(int sec) {
       return String.format("%02d:%02d", sec / 60, sec % 60);
    }
}

알고리즘 분류

문자열 처리 (String), 구현 (Implementation), 시뮬레이션 (Simulation)

'PS > B.O.J' 카테고리의 다른 글

14502번: 연구소  (0) 2026.03.24
1325번: 효율적인 해킹  (0) 2026.03.24
4949번: 균형잡힌 세상  (0) 2026.03.23
9012번: 괄호  (0) 2026.03.23
1436번: 영화감독 숌  (1) 2026.03.23