본문 바로가기

문제 풀이/Baekjoon

[백준] S4 11652번 카드 (JAVA)

문제 출처 - Baekjoon Online Judge

문제는 여기

 

11652번: 카드

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

www.acmicpc.net

[문제] 

준규는 숫자 카드 N장을 가지고 있다. 숫자 카드에는 정수가 하나 적혀있는데, 적혀있는 수는 -26^2보다 크거나 같고, 26^2보다 작거나 같다.

준규가 가지고 있는 카드가 주어졌을 때, 가장 많이 가지고 있는 정수를 구하는 프로그램을 작성하시오. 만약, 가장 많이 가지고 있는 정수가 여러 가지라면, 작은 것을 출력한다.

[입력]

첫째 줄에 준규가 가지고 있는 숫자 카드의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개 줄에는 숫자 카드에 적혀있는 정수가 주어진다.

[출력]

첫째 줄에 준규가 가장 많이 가지고 있는 정수를 출력한다.

 

 


[풀이]

1. 카드에 적힌 수의 범위가 int형을 벗어나기 때문에 long형을 사용해준다.

2. 카드를 입력받아 오름차순 정렬을 해준다.

3. 체크할 카드의 값에 들어가 있는 카드를 기준으로 카드들을 체크해준다.

 1) 만약 같은 카드라면 count 값을 증가시켜 준다.

 2) 다른 카드라면 count의 값을 1로 바꿔준다.

4. 체크를 하면서 count의 값이 max의 값보다 커진다면 체크할 카드를 현재 카드로 바꾸고 max값을 경신해준다.

5. 마지막에 체크할 카드에 들어가 있는 값을 출력해주면 된다.

[접근]

1. 처음에는 Map을 이용해서 카드와 값을 Key와 Value로 잡고 넣어서 정렬을 해주어야겠다고 생각했다.

2. 하지만 그렇게 하지 않고 위 풀이대로 풀어도 풀리겠다고 생각을 하고 풀었다.

[코드]

package BOJ_silver;

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

public class Main_S4_11652 {
	static int n;
	static long[] card;

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		n = Integer.parseInt(br.readLine());
		card = new long[n];

		// 입력받기
		for (int i = 0; i < n; i++) {
			card[i] = Long.parseLong(br.readLine());
		}
		
		Arrays.sort(card); // 정렬
		
		long check = card[0]; // 선택된 카드
		int count = 1; // 카드의 수
		int max = 1; // 최고값
		
		for (int i = 1; i < n; i++) {
			if (card[i] == card[i - 1]) { // 이전에 카드와 같은 카드라면
				count++; // 수를 증가
			}
			else { // 아니라면 1로 초기화
				count = 1;
			}
			
			if (count > max) { // max 값보다 카드의 수가 많으면
				max = count; // max값을 갱신해주기
				check = card[i]; // 선택 카드를 현재의 카드로 갱신해주기
			}
		}
		System.out.println(check);
	}
}