ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • BOJ) 카드
    알고리즘/백준 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);
        }
    }
    반응형

    '알고리즘 > 백준' 카테고리의 다른 글

    BOJ) 베르트랑 공준  (0) 2020.06.24
    BOJ) 소수 구하기  (0) 2020.06.24
    BOJ) 랜선 자르기  (0) 2020.06.24
    BOJ) 균형잡힌 세상  (0) 2020.06.23
    BOJ) 단어 정렬  (0) 2020.06.23

    댓글

Designed by Tistory.