1. 문제 정보
https://www.acmicpc.net/problem/2852
난이도 : S3
유형 : 문자열, 자료구조
시간 : O(N)
2. 문제 풀이
1팀, 2팀의 득점 시간을 각각의 덱에 저장하면서 진행한다.
득점 점수는 덱의 사이즈로 판별하면 되고
동점 상황 발생 시
1팀이 최근 득점에 성공했을 시 '1팀의 마지막 득점시간 - 2팀의 처음 득점시간'을 2팀의 총합 시간에 추가
2팀이 최근 득점 시, 반대로 1팀의 총합 시간에 추가하면 된다.
해당 팀의 총합 시간에 시간을 추가 후 1팀과 2팀의 덱에 있는 모든 득점 시간을 삭제한다.
N번 반복 후
마지막으로, 각 팀의 덱의 사이즈를 비교하여 덱의 사이즈가 큰 팀에게 '총 게임시간 - 덱의 마지막 득점 시간'을 해당 팀의 총합 시간을 추가한다.
ex
3 - 1) 1팀 -> 1팀 -> 1팀 -> 2팀 일시 동점의 상황이 발생하지 않은 경우
코드를 보면 이해가 쉬울 것이다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.StringTokenizer;
public class Main {
public static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static final StringBuilder sb = new StringBuilder();
public static StringTokenizer st;
public static final int TOTAL_GAME_SECOND = 48 * 60;
int N;
ArrayDeque<Integer> dqA;
ArrayDeque<Integer> dqB;
int totalA;
int totalB;
private 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 int convertStringToSecond(String timeString) {
String[] time = timeString.split(":");
return Integer.parseInt(time[0]) * 60 + Integer.parseInt(time[1]);
}
private void solution() throws IOException {
dqA = new ArrayDeque<>();
dqB = new ArrayDeque<>();
totalA = 0;
totalB = 0;
N = Integer.parseInt(br.readLine());
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
int team = Integer.parseInt(st.nextToken());
int second = convertStringToSecond(st.nextToken());
if (team == 1) {
dqA.addLast(second);
if (dqA.size() == dqB.size()) { // 동점 발생
totalB += dqA.peekLast() - dqB.peekFirst();
dqA.clear();
dqB.clear();
}
} else {
dqB.addLast(second);
if (dqA.size() == dqB.size()) { // 동점 발생
totalA += dqB.peekLast() - dqA.peekFirst();
dqA.clear();
dqB.clear();
}
}
}
if (dqA.size() > dqB.size()) {
totalA += TOTAL_GAME_SECOND - dqA.peekFirst();
} else if (dqA.size() < dqB.size()) {
totalB += TOTAL_GAME_SECOND - dqB.peekFirst();
}
sb.append(convertSecondToString(totalA)).append("\n").append(convertSecondToString(totalB));
System.out.println(sb);
}
public static void main(String[] args) throws IOException {
Main main = new Main();
main.solution();
}
}
'Algorithm, Problem Solving > 백준(boj)' 카테고리의 다른 글
[백준][Java] 28118 - 안전한 건설 계획 (0) | 2024.07.17 |
---|---|
[백준][Java] 2288 - 격자의 분리자 (2) | 2024.05.01 |
[백준][Java] 31650 - Maximizing Productivity (0) | 2024.04.20 |
[백준][Java] 11997 - Load Balancing (Silver) (0) | 2024.04.16 |
[백준][Java] 19951 - 태상이의 훈련소 생활 (0) | 2024.04.14 |
댓글