import java.lang.*;
import java.util.*;
public class Main {
public static final Scanner scanner = new Scanner(System.in);
public static final int MAX_TABLE_LENGTH = 10000;
public static int fillFrequencyTable(int[] data, int n, int[] table) {
List<Integer>list = new ArrayList<>();
for(int i = 0; i < n; i ++){
table[data[i]]++;
}
int value = 0;
for(int i = 0; i < MAX_TABLE_LENGTH; i ++){
if(value < table[i]){
value = table[i];
list.add(i);
}
}
list.sort(Collections.reverseOrder());
return list.get(0);
}
public static int getFrequentNumber(int[] data, int n) {
int[] table = new int[100000];
return fillFrequencyTable(data, n, table);
}
public static void main(String[] args) throws Exception {
int n = scanner.nextInt();
int[] data = new int[n];
for (int i = 0; i < n; i++) {
data[i] = scanner.nextInt();
}
int answer = getFrequentNumber(data, n);
System.out.printf("%04d", answer);
}
}
해석
1. table[10000]이라는 배열을 만들어 전화번호 뒷자리의 빈도 수를 계산한다.
2. 두번째 for문은 10000번 반복하며, 최대 빈도 수들을 찾아 List 자료구조에 넣어준다.
3. 빈도 수가 같을 경우 오름차순으로 출력하기로 하였으므로 Collections.reversOrder()를 통해 내림차순 정렬을 하였다.
4. 맨 앞에는 제일 빈도 수가 높은 숫자가 존재하게 되므로 list의 첫번째 원소를 .get(0) 해준다.
강의에서 풀은 풀이 ▼
더보기
import java.lang.*;
import java.util.*;
public class Main {
public static final Scanner scanner = new Scanner(System.in);
public static final int MAX_TABLE_LENGTH = 10000;
/**
* data[0] ~ data[n-1]에 등장한 번호들에 대한 빈도수 테이블을 채우는 함수
* @param data
* @param n
* @param table table[x] := data배열에서 x가 등장한 횟수
*/
public static void fillFrequencyTable(int[] data, int n, int[] table) {
for(int i = 0; i < n; i ++){
table[data[i]] ++;
}
}
/**
* data[0] ~ data[n-1]사이에서 가장 많이 등장한 번호를 반환하는 함수
* @param data
* @param n
* @return 가장 많이 등장한 번호. 여러개인 경우 사전순으로 가장 빠른 번호.
*/
public static int getFrequentNumber(int[] data, int n) {
int frequent_number = 0; //0000~9999중 가장 많이 등장한 번호
int []table = new int[MAX_TABLE_LENGTH];
fillFrequencyTable(data, n, table);
for(int number = 0; number < MAX_TABLE_LENGTH; number++){
int count = table[data[number]];
if(count > table[frequent_number]){
frequent_number = number;
}
}
return frequent_number;
}
public static void main(String[] args) throws Exception {
int n = scanner.nextInt();
int[] data = new int[n];
for (int i = 0; i < n; i++) {
data[i] = scanner.nextInt();
}
int answer = getFrequentNumber(data, n);
System.out.printf("%04d", answer);
}
}
해석
1. 내가 풀은 풀이와 똑같이 table[10000]의 배열을 생성하고 빈도 수를 계산한다.
2. List 자료구조를 추가한 부분이 없다. -> 그냥 getFrequentNumber의 반복문의 인덱스를 이용해서 제일 빈도 수가 높은 숫자를 갱신하였다. =을 써주지 않아 자연스럽게 작은 숫자가 나올 수 밖에 없다.
'자료구조 & 알고리즘 관련 > 코딩테스트' 카테고리의 다른 글
과유불급 (누적합) (0) | 2022.12.15 |
---|---|
색종이 (0) | 2022.12.14 |
피보나치 나머지 (0) | 2022.12.13 |
응모 (0) | 2022.12.13 |
페인트 (0) | 2022.12.13 |