Backend
home
🏀

[백준] NBA 농구

생성일
2025/02/10 00:52
태그
BaekJoon
게시일
2025/02/10
최종 편집 일시
2025/02/10 05:26

문제

해결 방안 고민

문제를 이해는 했으나 구현 방법이 떠오르지 않아서 시간을 많이 지체했다.
각 팀의 스코어 변수와 리드 시간 활용에 대한 개념이 서지 않아 구현이 어려웠다.
분과 시간에 대한 개념을 다시 이해했다.
분: 60으로 나눔
초: 60의 나머지
골이 들어갈 때마다 들어가는 시간과 팀을 적는다. 농구 경기는 정확히 48분 동안 진행됨. 각 팀이 몇 분동안 이기고 있었는지 출력. N 입력 둘째 줄부터 N개의 줄에 득점 정보가 주어짐... - 득점한 팀 번호 + " " + 득점한 시간 - 팀 번호는 1 또는 2 - 득점한 시간 MM:SS(분:초) - 분과 초가 한 자리일 경우 첫째자리가 0이다 - 분은 0보다 크거나 같고, 47보다 작거나 같으며, 초는 0보다 크거나 같고, 59보다 작거나 같다 (0 <= min <= 47), (0 <= second <= 59) == 테스트 케이스 분석 == 1 (골이 한 번 들어감) 1 20:00 (한 골은 1번 팀이 20분에 득점함) team = 1 String time String -> int로 변환하여 계산?! => 1번 팀이 득점한 시간 : 20분 => 농구는 총 48분 => 1번 팀이 이기고 있던 시간 28분 --- 3 1 01:10 2 21:10 2 31:30 StringTokenizer st = new StringTokenizer(br.readLine(), " "); int team = Integer.parseInt(st.nextToken()); String time = st.nextToken()
Markdown
복사

해결 방법

각 팀의 점수를 score1, score2 로 구분한다.
각 팀의 리드시간을 leadTime1, leadTime2로 구분한다.
농구 총 시간을 정한다. → 60 * 48
팀에 따라 score 점수를 증가시킨다(score1++, score2++).
최종 리드 시간을 입력한 시간으로 변경한다. ⇒ total second로 변경
String.format을 활용하여 “%02d:%02d” 형태로 출력한다.

코드

첫 번째 코드
package algo250210; import java.io.*; import java.util.*; // NBA 농구 - 실버 3 public class Baek2852 { 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()); // 1팀 점수 int score1 = 0; // 2팀 점수 int score2 = 0; // 최종적으로 리드 점수가 바뀐 시간 int lastLeadChangeTime = 0; // 각 팀의 리드 시간 int leadTime1 = 0; int leadTime2 = 0; // 농구 총 시간 int endTime = 60 * 48; for (int i = 0; i < N; i++) { StringTokenizer st = new StringTokenizer(br.readLine(), " "); int team = Integer.parseInt(st.nextToken()); String[] time = st.nextToken().split(":"); int scoreTime = Integer.parseInt(time[0]) * 60 + Integer.parseInt(time[1]); if (score1 > score2) { leadTime1 += scoreTime - lastLeadChangeTime; } else if (score2 > score1) { leadTime2 += scoreTime - lastLeadChangeTime; } // 팀에 따라 score 점수 증가 if (team == 1) { score1++; } else { score2++; } lastLeadChangeTime = scoreTime; } if (score1 > score2) { leadTime1 += endTime - lastLeadChangeTime; } else if (score2 > score1) { leadTime2 += endTime - lastLeadChangeTime; } // 분은 60으로 나누고, 초는 60을 나눈 나머지로 계산함 int min1 = leadTime1 / 60; int sec1 = leadTime1 % 60; int min2 = leadTime2 / 60; int sec2 = leadTime2 % 60; bw.write(String.format("%02d:%02d\n", min1, sec1)); bw.write(String.format("%02d:%02d\n", min2, sec2)); bw.flush(); bw.close(); br.close(); } }
Java
복사
덱으로 구현한 코드도 있어서 가져와 봤다.
package algo250210; import java.io.*; import java.util.*; // 덱을 활용 /* 동점 상황 발생 시 - 1팀이 최근 득점에 성공했을 경우 '1팀의 마지막 득점 시간 - 2팀의 처음 득점 시간'을 2팀의 총합 시간에 추가 - 2팀이 최근 득점 시, 반대로 1팀의 총합 시간에 추가 - 해당 팀의 총합 시간에 시간을 추가한 후 1팀과 2팀의 덱에 있는 모든 득점 시간을 삭제 N번 반복 후 각 팀의 덱 사이즈를 비교하여 덱 사이즈가 큰 팀에게 '총 게임시간 - 덱의 마지막 득점 시간'을 해당 팀의 총합 시간으로 추가한다 */ public class Baek2852_2 { private static final int TOTAL_GAME_SECOND = 48 * 60; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuilder sb = new StringBuilder(); ArrayDeque<Integer> dq1 = new ArrayDeque<>(); ArrayDeque<Integer> dq2 = new ArrayDeque<>(); int total1 = 0; int total2 = 0; int N = Integer.parseInt(br.readLine()); for (int i = 0; i < N; i++) { StringTokenizer st = new StringTokenizer(br.readLine(), " "); int team = Integer.parseInt(st.nextToken()); int second = convertStringToSecond(st.nextToken()); if (team == 1) { dq1.addLast(second); if (dq1.size() == dq2.size()) { // 동점 발생 total2 += dq1.peekLast() - dq2.peekFirst(); dq1.clear(); dq2.clear(); } } else { dq2.addLast(second); if (dq1.size() == dq2.size()) { // 동점 발생 total1 += dq2.peekLast() - dq1.peekFirst(); dq1.clear(); dq2.clear(); } } } if (dq1.size() > dq2.size()) { total1 += TOTAL_GAME_SECOND - dq1.peekFirst(); } else if (dq2.size() > dq1.size()) { total2 += TOTAL_GAME_SECOND - dq2.peekFirst(); } sb.append(convertSecondToString(total1)).append("\n").append(convertSecondToString(total2)); System.out.println(sb); } private static String convertSecondToString(int totalTime) { int min = totalTime / 60; int second = totalTime % 60; StringBuilder sb = new StringBuilder(); sb.append(String.format("%02d", min)).append(":").append(String.format("%02d", second)); return sb.toString(); } private static int convertStringToSecond(String timeString) { String[] time = timeString.split(":"); return Integer.parseInt(time[0]) * 60 + Integer.parseInt(time[1]); } }
Java
복사

확인 결과

두 코드 모두 시간은 동일했다.