알고리즘/백준

BOJ) 카드

Zin0_0 2020. 6. 24. 16:57
반응형

카드

 

11652번: 카드

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

www.acmicpc.net

풀이

 

문제를 보고 바로 떠오른 방법은 Map을 이용해서 푸는 방법이었다.

Map을 통해 해당 카드가 몇 번 나왔는지 카운트 한 다음, value를 통해 key를 정렬하는 방법이다.

문제의 조건에 따라, 나온 횟수가 같은 경우에는 카드의 숫자가 최소인 것부터 정렬해서 리스트의 가장 앞 부분에 있는 값을 리턴했다.

바로 맞기는 했지만, 효율이 너무 좋지 않았다. 메모리와 속도 측면도 그렇고, Map을 사용하지만 어차피 Key값을 저장하기 위해서 List를 사용해야하는 부분도 그렇고, List로 바로 푸는 것도 괜찮을 것 같아서 바로 풀었다.

 

Lits에 값들을 저장하고 오름차순으로 저장한 다음에, 해당 숫자들이 몇번 나오는지 카운트 해줬다.

값들은 오름차순을 증가하고 있기 때문에, 카운트가 더 많은 경우에만 답을 최신화 해주었다. (왜냐하면 count가 같은 경우에는 앞서 나온 값들이 답이 되기 때문에)

 

결론적으로는 메모리를 덜 잡아먹었다.

하지만, for문을 통해 직접 count를 하면서 속도는 유사했다. (값이 더 많아지면 커질 것 같다.)

두 개의 풀이를 봤을 때, List로 푸는게 더 간단하지만, HashMap의 Key를 Value 값에 따라 정렬하는 방법도 알아두면 좋을 것 같다.

 

코드 1

 

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

public class CardSort_11652 {
    public static void main(String[] args) throws IOException {
        solution(new BufferedReader(new InputStreamReader(System.in)));
    }

    private static void solution(BufferedReader br) throws IOException {
        int n = Integer.parseInt(br.readLine());
        HashMap<Long, Integer> cardMap = new HashMap<>(); // HashMap을 이용한 풀이(메모리를 조금 더 사용함)
        for(int i=0; i<n; i++) {
            long key = Long.parseLong(br.readLine());
            if(cardMap.containsKey(key)) {
                cardMap.replace(key, cardMap.get(key)+1);
            } else {
                cardMap.put(key, 1);
            }
        }
        List<Long> keySetList = new ArrayList<>(cardMap.keySet());
        Collections.sort(keySetList, new Comparator<Long>() {
            @Override
            public int compare(Long o1, Long o2) {
                int cnt1 = cardMap.get(o1);
                int cnt2 = cardMap.get(o2);
                if(cnt1 < cnt2) {
                    return 1;
                } else if(cnt1 == cnt2) {
                    return o1 > o2? 1 : -1;
                }
                return -1;
            }
        });
        System.out.println(keySetList.get(0));
	}
}

 

코드 2

 

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

public class CardSort_11652 {
    public static void main(String[] args) throws IOException {
        solution(new BufferedReader(new InputStreamReader(System.in)));
    }

    private static void solution(BufferedReader br) throws IOException {
        int n = Integer.parseInt(br.readLine());
        List<Long> cardList = new ArrayList<>();    // List를 활용한 풀이, 공간은 덜 사용하지만 속도는 아주 조금 더 느림
        for(int i=0; i<n; i++) {
            cardList.add(Long.parseLong(br.readLine()));
        }
        Collections.sort(cardList);

        long answer = cardList.get(0);
        int answerCnt =0;

        long prev = answer;
        int prevCnt =0;
        for(long num : cardList) {
            if(num == prev) {
                prevCnt++;
            } else {
                if(answerCnt <prevCnt) {
                    answer = prev;
                    answerCnt = prevCnt;
                }
                prev = num;
                prevCnt =1;
            }
        }
        if(answerCnt < prevCnt) {
            answer = prev;
        }
        System.out.println(answer);
    }
}
반응형