반응형
-내 생각
이 문제의 경우 처음 봤을 때, 주어질 수 있는 정수의 범위만큼 별도의 배열을 생성하여서 해당 정수 값을 인덱스로 하여서 해당 정수를 만날 때마다 해당 인덱스 값을 증가시키는 방법을 생각했었는데, 문제를 보면 데이터의 범위가 +-2^62로 굉장히 크기 때문에 이러한 방식을 사용하면 메모리 낭비가 심하고 데이터의 탐색 역시 오래 걸릴 것 같아 사용하지 않았다.
-해법
위에서 언급한 문제점을 해결하기 위해서 우선 값을 입력받는 배열을 생성해 값을 입력받은 후 오름차순 또는 내림차순 정렬을 통해 같은 숫자를 연속하게 놓이게 만들었다. 이후 n-2까지 탐색을 통해 다음 원소와 비교하여 값이 달라질 경우 카운트 변수를 초기화하여 최대 카운트 수를 가지는 정수를 찾은 후 출력하려고 했다.
그러나 문제 제출 시 런타임 에러가 많이 발생하여 인덱스 참조에 문제가 있나 생각해보았는데, 문제가 없었고 검색을 해보았는데 관련 내용이 존재하지 않아 막혔지만, 잘 생각해보니 입력되는 데이터의 값이 굉장히 클 경우가 있기 때문에 데이터 타입을 long형으로 사용해야 했다. 이 부분에 주의해주면 어렵지 않은 문제였다.
import java.util.*;
import java.math.*;
public class Main {
static long card[]; // 데이터 값을 저장 할 배열, long형에 유의
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
card = new long[n];
for(int i=0;i<n;i++) {
card[i] = sc.nextLong(); // 데이터의 입력역시 nextLong()을 사용해야 한다.
}
if(n==1) { // n이 1일 경우는 0번 인덱스만 출력해주면 된다.
System.out.println(card[0]);
return;
}
Arrays.sort(card); // 입력받은 데이터를 오름차순 정렬
int cnt =1 , a_cnt=0; // cnt는 데이터에 따라 증가하는 변수, a_cnt는 최대 갯수를 저장 할 변수
long ans=0; // 정답을 출력 할 변수, 이 역시 long형에 주의해야 한다.
for(int i=0;i<n-1;i++) { // 탐색은 n-2까지 탐색한다.
if(i ==n-2) { // n-2인 경우
if(card[i] == card[i+1]) // 마지막 원소가 같다면 cnt 증가
cnt++;
// 마지막 원소가 다르다면 고려해 줄 필요가 없다.
if(a_cnt<cnt) { // 최대 카운트 수가 현재 카운트된 수보다 작다면
a_cnt = cnt; // 최대 카운트 수 변경
ans = card[i]; // 해당 정수를 ans변수에 저장
cnt =1;
}else if(a_cnt == cnt) { // 같다면 이미 저장된 값과 비교하여 최솟값을 저장
ans = Math.min(ans, card[i]);
}
}
else if(card[i] == card[i+1]) { // 현재 정수와 다음 정수가 같다면 cnt증가
cnt++;
}
else { // 현재 정수와 다음 정수가 다르다면
if(a_cnt<cnt) { // 위의 조건문과 동일
a_cnt = cnt;
ans = card[i];
cnt =1;
}else if(a_cnt == cnt) {
ans = Math.min(ans, card[i]);
a_cnt = cnt;
cnt=1;
}else { // 위 두 조건에 걸리지 않으면 cnt변수만 초기화 해준다.
cnt =1;
}
}
}
System.out.println(ans);
}
}
반응형