Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 데이터베이스
- 티스토리챌린지
- 운영체제
- C
- 파이썬
- 코딩테스트
- 알고리즘
- 자바스크립트
- #코드트리 #코딩테스트 #코테공부 #백트래킹 #알고리즘 기초
- 자료구조
- 코테공부
- 1일1코테
- 인접 행렬
- 프로그래머스
- 개발자루틴
- 코드트리
- 항해99
- 코딩테스트사이트추천
- til
- 갭체크
- 99클럽
- 프로그래밍 언어
- 코딩테스트준비
- 웹
- 자바
- 플로이드-워셜
- 개발자취업
- 연결 리스트
- Java
- 오블완
Archives
- Today
- Total
와드의 블로그
2852번: NBA 농구 본문
문제
농구 경기는 48분 동안 진행됩니다. 각 팀이 득점한 시간과 팀 번호가 주어질 때, 1번 팀이 이기고 있던 시간과 2번 팀이 이기고 있던 시간을 출력하는 문제입니다.
- 입력: 첫째 줄에 골이 들어간 횟수 N (1 ≤ N ≤ 100)이 주어집니다. 둘째 줄부터 N개의 줄에 득점한 팀의 번호(1 또는 2)와 득점 시간(MM:SS 형식)이 주어집니다.
- 출력: 첫째 줄에 1번 팀이 이기고 있던 시간, 둘째 줄에 2번 팀이 이기고 있던 시간을 "MM:SS" 형식으로 출력합니다.
링크: https://www.acmicpc.net/problem/2852
풀이
시간을 모두 초(second) 단위로 변환하여 계산하고, 출력 시에 다시 지정된 문자열 포맷으로 변환하는 것이 핵심인 시뮬레이션 문제입니다.
- 시간 변환 메서드:
- timeToSec: "MM:SS" 형식의 문자열을 받아 분에 60을 곱하고 초를 더해 총 '초' 단위의 정수로 변환합니다.
- secToTimeFormat: 누적된 총 초(sec)를 다시 "MM:SS" 형식의 문자열로 변환합니다. String.format("%02d:%02d", m, s)를 사용하여 항상 두 자리 숫자로 맞춰줍니다.
- 득점 시점마다 시간 누적:
- 득점이 발생할 때마다, 직전 득점 시각(prev)부터 현재 득점 시각(time)까지 어느 팀이 이기고 있었는지 점수(score1, score2)를 비교합니다.
- score1 > score2라면 1번 팀의 누적 시간(winningTime1)에 time - prev를 더합니다.
- score1 < score2라면 2번 팀의 누적 시간(winningTime2)에 time - prev를 더합니다. (동점일 때는 어느 팀의 시간도 늘어나지 않습니다.)
- 시간 누적을 마친 뒤, 이번에 득점한 팀의 점수를 1 올리고 prev를 현재 득점 시간으로 갱신합니다.
- 경기 종료 처리:
- 모든 득점 기록을 처리한 후, 마지막 득점 시점(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 |