본문 바로가기

Java/Java 알고리즘 인프런

1. 빈도수 정렬 (+Hash)

반응형
package Q1;

import java.util.*;

public class Main {
    //1. 빈도수 정렬
    public static void main(String[] args) {
        //String str="aaAAcccbbbBB";
        String str="kdkDKKGkdkgks";
        solve(str);
    }
    public static String solve(String str){
        Map<Character, Integer> map = new HashMap<>();
        String answer="";
        for(char c: str.toCharArray()){
            map.put(c, map.getOrDefault(c, 0)+1);
        }
        //Map.Entry로 List만들어 정렬하기
        List<Map.Entry<Character,Integer>> entryList= new LinkedList<>(map.entrySet());
        Collections.sort(entryList, ((o1, o2) -> o1.getValue()==o2.getValue()? o1.getKey()-o2.getKey():o2.getValue()-o1.getValue()));
        for(Map.Entry<Character,Integer> entry:entryList){
            for(int i=0;i<entry.getValue();i++) answer+=entry.getKey();
        }
        System.out.println(answer);
        return answer;
    }
}

 

+) 세련된 풀이

: 입력된 문자열을 해쉬맵을 이용해 카운팅하고, 해쉬맵을 Entry형 List 로 변환한 다음 내림차순 정렬

 

import java.util.*;
import java.util.Map.Entry;
class Main {	
	public String solution(String s){
		String answer="";
		HashMap<Character, Integer> map = new HashMap<>();
		for(char x : s.toCharArray()){
			map.put(x, map.getOrDefault(x, 0)+1); 
		}
		List<Entry<Character, Integer>> list = new ArrayList<Entry<Character, Integer>>(map.entrySet());
		Collections.sort(list, new Comparator<Entry<Character, Integer>>(){
			public int compare(Entry<Character, Integer> a, Entry<Character, Integer> b){
				return b.getValue().compareTo(a.getValue());
			}
		});

		for(Entry<Character, Integer> x : list){
			for(int i=0; i<x.getValue(); i++) answer+=x.getKey();	
		}
		return answer;
	}

	public static void main(String[] args){
		Main T = new Main();
		System.out.println(T.solution("aaAAcccbbbBB"));//bbbcccaaAABB
		System.out.println(T.solution("kdkDKKGkdkgks"));//kkkkkddKKsDGg
		System.out.println(T.solution("ckdowiskjgwigAGD"));//wwggiikkAcsdDGjo
	}
}
반응형