단순히 카드의 개수를 입력받고,
그 개수만큼 카드의 숫자를 저장할 배열을 만들고 정렬한 뒤
가장 많은 카드를 출력하면 된다.
이때 카드에 적힌 숫자의 범위가 -2^62부터 2^62이므로 long 타입을 써야 한다.
1. 카드의 개수 N을 입력받는다.
2. N 크기의 카드에 적힌 숫자를 저장할 long 타입 배열을 생성한다.
3. 배열에 카드에 적힌 숫자를 저장한다.
4. Array.sort()로 정렬한다.
5. 한 숫자의 빈도수를 저장할 cnt와,
최대 빈도를 저장할 max,
빈도수가 가장 높은 수의 인덱스를 저장할 max_idx를 생성한다.
6. 정렬된 배열을 한번 쭉 돌면서 같은 숫자가 몇 번이나 나오는지 개수를 센다.
6-1. cnt가 max보다 커지면 max값을 갱신하고, max_idx를 저장한다.
7. 배열에서 max_idx 번째에 있는 값을 출력한다.
문제에서 가장 많이 가지고 있는 카드의 개수가 여러 장이라면 가장 작은 것을 출력하라고 했는데,
for(int i=0;i<N-1;i++) {
if(arr[i]==arr[i+1]) cnt++;
else cnt = 1;
if(cnt>max) {
max = cnt;
max_idx = i;
}
}
cnt가 max보다 커질 때만 max_idx가 갱신되므로,
빈도수가 같은 숫자가 여러 개일 때 자연스럽게 배열에서 가장 앞쪽에 위치하는(크기가 작은) 숫자의 인덱스를 저장할 수 있다.
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
long[] arr = new long[N];
for(int i=0;i<N;i++){
arr[i] = Long.parseLong(br.readLine());
}
Arrays.sort(arr);
int cnt = 1, max = -1, max_idx=0;
for(int i=0;i<N-1;i++) {
if(arr[i]==arr[i+1]) cnt++;
else cnt = 1;
if(cnt>max) {
max = cnt;
max_idx = i;
}
}
System.out.println(arr[max_idx]);
}
}
이것도 다시 풀어보았다.
이번엔 일반 배열이 아닌 ArrayList를 썼는데 채점을 하다가 14%부근에서 틀렸다고 판정돼서 당황스러웠다.
문제는 여기였다.
if(list.get(i)==list.get(i+1))
객체에서 ==는 주소값을 비교하는 것이고,
equals()는 객체의 값을 비교하는 메서드이다.
이때 java에서 Long은 참조형 변수이므로
위 문장을 실행하면 list에서 i번째의 객체와 i+1번째 객체의 주소를 비교하게 되는 것이다.
==로 비교하는 것이 아니라 equals()를 사용하니 잘 동작이 됐다.
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args)throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
ArrayList<Long> list = new ArrayList<Long>();
for(int i=0;i<n;i++){
list.add(Long.parseLong(br.readLine()));
}
Collections.sort(list);
int cnt = 1;
int max = -1;
int max_idx = 0;
for(int i=0;i<n-1;i++){
// if(list.get(i)==list.get(i+1))을 아래처럼 수정했더니 정답판정이 나왔다.
if(list.get(i).equals(list.get(i+1))){
cnt++;
}
else{
cnt=1;
}
if(cnt>max){
max = cnt;
max_idx = i;
}
}
System.out.print(list.get(max_idx));
}
}
'[BOJ] - JAVA' 카테고리의 다른 글
[백준] 12101 : 1, 2, 3 더하기 2 JAVA 풀이 (0) | 2022.06.11 |
---|---|
[백준] 10825 : 국영수 JAVA 풀이 (0) | 2022.06.11 |
[백준] 11004 : K번째 수 JAVA 풀이 (0) | 2022.06.11 |
[백준] 11057 : 오르막 수 JAVA 풀이 (0) | 2022.06.10 |
[백준] 11053 : 가장 긴 증가하는 부분 수열 JAVA 풀이 (0) | 2022.06.10 |