PS(Java)/백준

[PS] 백준 11652번 카드

UL :) 2022. 5. 23. 03:28

문제

 

11652번: 카드

준규는 숫자 카드 N장을 가지고 있다. 숫자 카드에는 정수가 하나 적혀있는데, 적혀있는 수는 -262보다 크거나 같고, 262보다 작거나 같다. 준규가 가지고 있는 카드가 주어졌을 때, 가장 많이 가지

www.acmicpc.net

 

풀이

다뤄야 할 데이터, N의 최대 개수는 십만개이지만,

카드에 입력될 수 있는 수의 범위는 -2의 62승~ 2의 62승이므로 long타입 배열을 선언한다.

 

카드배열에 수를 입력받은 뒤 가장 많은 개수의 카드의 값을 출력하는 문제이다.

주의할 점은 가장 많은 개수의 카드가 여러종류일 경우 카드의 숫자가 더 작은 것을 출력한다는 점이다.

생각해보면 두 가지 방법이 있다.

 

방법1) Arrays.sort로 오름차순 정렬을 한 뒤 카드 개수를 카운트하기

방법2) HashMap을 사용

 

  • 가장 많은 개수의 카드를 갱신
  • 같은 개수일 경우 카드의 숫자가 더 작은 것으로 갱신

 

나는 방법1을 사용하여 풀어보았다. 마지막에 헷갈리는 부분은 인터넷을 참고했다..

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
	
	public static void main(String[] args) throws NumberFormatException, IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		int N = Integer.parseInt(br.readLine());
		long[] card = new long[N];
		
		for(int i=0; i<N; i++) {
			card[i] = Long.parseLong(br.readLine());
		}
		
		Arrays.sort(card);//오름차순 정렬

		int cnt = 1; //카드는 적어도 한장
		int maxCnt=1, maxIdx = 0; //가장 큰 수 저장

		//카드 개수 세기
		for(int i=1; i<N; i++) {

			if(card[i-1] == card[i]) cnt++; //같은 값이면 카운트 증가
			else cnt = 1; //다른 값이면 카운트는 1
			
			//매번 maxCnt와 비교
			if(maxCnt < cnt) { //클 경우에만 max값을 바꾸므로 같은 카운트면 작은 수가 max값이 됨
				maxCnt = cnt;
				maxIdx = i;
			}
		}
		System.out.println(card[maxIdx]);
		
	}
}