문제
해결 방안 고민
•
문제를 이해는 했으나 구현 방법이 떠오르지 않아서 시간을 많이 지체했다.
•
각 팀의 스코어 변수와 리드 시간 활용에 대한 개념이 서지 않아 구현이 어려웠다.
•
분과 시간에 대한 개념을 다시 이해했다.
◦
분: 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
복사
확인 결과
•
두 코드 모두 시간은 동일했다.