문제 자체는 쉬운데 문제 이해를 잘못했다.
문제풀이
매주 랭킹에 선수 이름이 오를 때마다 선수의 포인트가 1포인트씩 오르고 그걸 선수별로 더해서 가장 많은 포인트를 가진 선수가 1등을 한다.
2등 선수를 구해야하니까 배열의 index를 선수 번호로 삼아서 arr[선수번호] = 포인트 이렇게 저장되게 한다.
이후 최대값을 비교한 후 1등 선수가 최대값을 가질텐데, 한번 더 for문 돌려서 2등 선수를 구하면 된다.
인덱스를 선수 번호로 이용했기 때문에 따로 오름차순 정렬하지 않아도 for문 돌리면서 차례대로 출력하면 오름차순으로 나온다.
보완할 점
문제 이해를 잘못해서 실수한거, 종료조건 while(true) 쓰고 내부에 설정해야하는데 비효율적으로 0 0 그대로 받으려고 한 점, 인덱스 이용하는 건 좋았는데 인덱스로 정렬할 생각 하지 못한 것, 최댓값 비교 Math.max 이용하자.
문제코드
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while(true) {
StringTokenizer st = new StringTokenizer(br.readLine());
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
if(N == 0 & M == 0){
break;
}
int[] arr = new int[10001];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {
int num = Integer.parseInt(st.nextToken());
if (arr[num]==0) {
arr[num] = 1;
} else {
arr[num]++;
}
}
}
int firstNum = -1;
for (int i = 0; i < 10001; i++) {
firstNum=Math.max(firstNum,arr[i]);
}
int secondMax = -1;
for (int i = 0; i < 10001; i++) {
if(arr[i]!=firstNum){
secondMax = Math.max(secondMax,arr[i]);
}
}
for (int i = 0; i < 10001; i++) {
if (arr[i] == secondMax) {
sb.append(i).append(" ");
}
}
System.out.println(sb.toString());
}
}
}'알고리즘 리뷰' 카테고리의 다른 글
| 백준 JAVA 1969 DNA 리뷰 (1) | 2024.02.08 |
|---|---|
| 백준 JAVA 1389 케빈 베이컨의 6단계 법칙 리뷰 (0) | 2024.02.07 |
| 백준 JAVA 7576번 토마토 리뷰 (0) | 2023.08.31 |
| 백준 JAVA 10026번 적록색약 리뷰 (0) | 2023.08.31 |
| 백준 JAVA 10845번 큐 리뷰 (0) | 2023.08.31 |