백준 27522번
https://www.acmicpc.net/problem/27522
private static PriorityQueue<Time> pque = new PriorityQueue<>();
private static class Time implements Comparable<Time> {
int M;
int SS;
int sss;
String team;
public Time(int m, int SS, int sss, String team) {
M = m;
this.SS = SS;
this.sss = sss;
this.team = team;
}
@Override
public String toString() {
return "Time{" +
"M=" + M +
", SS=" + SS +
", sss=" + sss +
", team='" + team + '\'' +
'}';
}
@Override
public int compareTo(Time o) {
if (M == o.M) {
if (SS == o.SS) {
return sss - o.sss;
}
return SS - o.SS;
}
return M - o.M;
}
} // End of Time class
정렬을 하기위해서 PriorityQueue를 사용했다. (이하 Pque)
Pque는 Comparable 구현체를 만들어야 한다 여기서
compareTo를 문제에서 원하는 대로 구현하기만 하면 된다.
시간 순으로 정렬하는 문제이니까 가장 우선순위는 M이 낮은 순으로 정렬해야 할 거고,
M이 같을 경우 SS를 기준으로 정렬한다. SS도 같을 경우 sss순으로 정렬하면 된다.
int size = pque.size();
for (int i = 0; i < size; i++) {
Time temp = pque.poll();
if(temp.team.equals("R")) {
redScore += scoreArr[i];
} else {
blueScore += scoreArr[i];
}
}
pque
에 값을 넣고 다시 꺼내면서, 순서에 맞게 점수를 측정하고, 어떤 팀이 승리했는지 출력하면 된다.
참고로 PriorityQueue는 그냥 반복문으로 출력했을 때는 정렬이 되지 않은 상태로 나오게되므로, 정렬이 된 상태로 보여주기 위해서는 poll()을 해서 값을 모두 꺼내야만 정렬이 되어서 나온다는 점을 잊어서는 안된다.
Priority Queue는 값을 넣을 떄 내부에서 정렬된 것이 아님.. Tree형태로 값이 들어가는데, 단지 부모 > 자식의 성질만 유지가 되므로, 정확히 내가 설정한대로 정렬된 것은 아니다. 즉, 자식 끼리는 정렬되어 있지 않다.
정확히는 heap의 자료구조를 이해하는 것이 중요하다
import java.io.*;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
private static int redScore = 0;
private static int blueScore = 0;
private static int[] scoreArr = {10, 8, 6, 5, 4, 3, 2, 1, 0};
private static PriorityQueue<Time> pque = new PriorityQueue<>();
private static class Time implements Comparable<Time> {
int M;
int SS;
int sss;
String team;
public Time(int m, int SS, int sss, String team) {
M = m;
this.SS = SS;
this.sss = sss;
this.team = team;
}
@Override
public String toString() {
return "Time{" +
"M=" + M +
", SS=" + SS +
", sss=" + sss +
", team='" + team + '\'' +
'}';
}
@Override
public int compareTo(Time o) {
if (M == o.M) {
if (SS == o.SS) {
return sss - o.sss;
}
return SS - o.SS;
}
return M - o.M;
}
} // End of Time class
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
StringTokenizer st;
for (int i = 0; i < 8; i++) {
st = new StringTokenizer(br.readLine(), ":");
int m = Integer.parseInt(st.nextToken());
int ss = Integer.parseInt(st.nextToken());
String temp = st.nextToken();
int sss = Integer.parseInt(temp.substring(0, 3));
String team = temp.substring(temp.length() - 1);
pque.offer(new Time(m, ss, sss, team));
}
int size = pque.size();
for (int i = 0; i < size; i++) {
Time temp = pque.poll();
if(temp.team.equals("R")) {
redScore += scoreArr[i];
} else {
blueScore += scoreArr[i];
}
}
if (redScore > blueScore) {
sb.append("Red");
} else {
sb.append("Blue");
}
bw.write(sb.toString());
bw.close();
} // End of main
} // End of Main class