본문 바로가기

[BOJ] - JAVA

[백준] 11652 : 카드 JAVA 풀이

단순히 카드의 개수를 입력받고,

그 개수만큼 카드의 숫자를 저장할 배열을 만들고 정렬한 뒤

가장 많은 카드를 출력하면 된다.

 

이때 카드에 적힌 숫자의 범위가 -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));
    }
}