강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

robin님의 프로필 이미지
robin

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

2-G

2 - G 2910 자바 코드 공유합니다.

작성

·

344

1

한번에 정렬을 하면 될걸 시작부터 잘못 접근해서 개판이 난 코드입니다.

import java.util.*;

public class Prob2910 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sc.nextInt();
        Map<Integer,Integer> freqs = new HashMap<>(); // 숫자 - 빈도
        Map<Integer,Integer> index = new HashMap<>(); // 숫자 - 첫 등장 위치
        for (int i = 0; i < n; i++) {
            int num = sc.nextInt();
            if(freqs.containsKey(num)){
                freqs.put(num, freqs.get(num)+1);
            }else {
                index.put(num,i);
                freqs.put(num,1);
            }
        }
        Map<Integer,List<Integer>> freqNums = new HashMap<>(); // 빈도 - 숫자들
        for (int num: freqs.keySet()) {
            int freq = freqs.get(num);
            if(freqNums.containsKey(freq)){
                freqNums.get(freq).add(num);
            }else {
                List<Integer> nums = new ArrayList<>();
                nums.add(num);
                freqNums.put(freq,nums);
            }
        }
        for (List<Integer> nums: freqNums.values()) {
            Collections.sort(nums, Comparator.comparingInt(index::get));
        }
        freqNums.keySet().stream().sorted(Comparator.reverseOrder()).forEach(key->{
            List<Integer> list = freqNums.get(key);
            list.forEach(e->{
                int count = freqs.get(e);
                for (int i = 0; i < count; i++) {
                    System.out.print(e+" ");
                }
            });
        });
    }
}

해설 강의처럼 한번에 정렬을 하는 코드입니다.

import java.util.*;

public class Prob2910_sortOnce {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sc.nextInt();
        Map<Integer,Integer> numFreq = new HashMap<>();
        Map<Integer,Integer> numFirstIndex = new HashMap<>();
        List<Integer> nums = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            int num = sc.nextInt();
            nums.add(num);
            if(numFreq.containsKey(num)){
                numFreq.put(num,numFreq.get(num)+1);
            }else {
                numFreq.put(num,1);
                numFirstIndex.put(num,i);
            }
        }
        nums.sort((o1, o2) -> {
            if (numFreq.get(o1).equals(numFreq.get(o2))) {
                return numFirstIndex.get(o1) - numFirstIndex.get(o2);
            } else {
                return numFreq.get(o2) - numFreq.get(o1);
            }
        });
        nums.forEach(e->System.out.print(e+" "));
    }
}

답변 1

0

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 robin님 공유 감사드립니다. ㅎㅎ

자바로 포팅하시면서 하는 것도 좋은 공부방법입니다.

 

질문 있으시면 언제든지 질문 부탁드립니다.

감사합니다.

강사 큰돌 올림.

robin님의 프로필 이미지
robin

작성한 질문수

질문하기