[백준,BOJ 11652] 카드( JAVA 구현)
코테/백준 온라인 저지(BOJ)

[백준,BOJ 11652] 카드( JAVA 구현)

반응형

-내 생각

  이 문제의 경우 처음 봤을 때, 주어질 수 있는 정수의 범위만큼 별도의 배열을 생성하여서 해당 정수 값을 인덱스로 하여서 해당 정수를 만날 때마다 해당 인덱스 값을 증가시키는 방법을 생각했었는데, 문제를 보면 데이터의 범위가 +-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);
		
	}
	
}

 

 

반응형