ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Camel][Java] 배열 중복 요소 카운팅 (HashMap Value 정렬)
    Java/알고리즘 2020. 7. 8. 00:00

    1. HashMap의 값(Value)을 기준으로한 정렬

    Java 에서 HashMap에 저장한 데이터를 값(Value)으로 정렬하는 방법을 알아보겠습니다.

    import java.util.Map;
    import java.util.HashMap;
    import java.util.Collections;
    import java.util.List;
    import java.util.Comparator;
    import java.util.ArrayList;
    
    public class Main{
    	
    	public static void main(String[] args){
    		Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    		
    		map.put(1, 100);
    		map.put(2, 10);
    		map.put(3, 1000);
    		map.put(4, 10000);
    		map.put(5, 10);
    		
    		List<Integer> keySetList = new ArrayList<>(map.keySet());
    		
    		// Value 값으로 오름차순 정렬 
    		Collections.sort(keySetList, (k1, k2) -> (map.get(k1).compareTo(map.get(k2))));
    		
    		for(Integer key : keySetList) {
    			System.out.println("key : " + key + " / " + "value : " + map.get(key));
    		}
    		
    		System.out.println();
    		
    		// Value 값으로 내림차순 정렬
    		Collections.sort(keySetList, (k1, k2) -> (map.get(k2).compareTo(map.get(k1))));
    		for(Integer key : keySetList) {
    			System.out.println("key : " + key + " / " + "value : " + map.get(key));
    		}
    	}
    }

    위의 코드를 실행해보면 아래와 같이 value값에 의해 정렬된 결과를 확인할 수 있습니다. 

     

    key : 2 / value : 10
    key : 5 / value : 10
    key : 1 / value : 100
    key : 3 / value : 1000
    key : 4 / value : 10000

    key : 4 / value : 10000
    key : 3 / value : 1000
    key : 1 / value : 100
    key : 2 / value : 10
    key : 5 / value : 10

     

     

    2. HashMap의 정렬을 활용한 배열 중복 요소 카운팅 문제

    이 문제의 내용은 int형 배열과 n값이 주어질 때, 배열 내의 중복횟수가 n번째로 적은 배열 요소를 출력하는 문제입니다.

     

    우선 메인 메소드를 확인해보면 nthLowestSelling 이라는 메소드를 호출하고 있는 것을 확인할 수 있습니다. 이 메소드의 파라미터로는 int형 배열과 n번째로 중복횟수가 적은 수를 반환하기 위해 int형 변수 n을 받습니다. 

     

    문제에서 주어진 배열은 아래와 같습니다. 그리고 각 숫자별 중복횟수를 확인해보면 아래와 같습니다. 

     

    { 5, 4, 3, 2, 1, 5, 4, 3, 2, 5, 4, 3, 5, 4, 5 }

     

    1 는 1회

    2 는 2회

    3 은 3회

    4 는 4회

    5 는 5회 

     

    따라서 문제에서 주어진 n 값이 2이므로 중복횟수가 2번째로 적은 수는 2이므로 2가 문제의 정답입니다. 

     

    파라미터로 전달받은 배열의 요소를 for문은 통해 가져와 HashMap의 key로 사용하고 같은 Key가 반복될 때마다 value를 1씩 증가시켜주었습니다. 

     

    따라서 for문을 완전히 수행했을 때, HashMap의 Key값에는 주어진 배열에 있는 요소들의 종류가 들어갈 것이고, value에는 각 종류별 중복횟수가 카운팅 될 것입니다. 

     

    HashMap의 value 정렬을 사용한 간단한 문제였고, 이 문제의 코드는 아래와 같습니다.

     

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class unload {
        public static int nthLowestSelling(int[] sales, int n) {
            Map<Integer, Integer> m = new HashMap<Integer,Integer>();
        	
            for (int i=0; i<sales.length; i++) {
            	if(m.containsKey(sales[i])) {
            		int cnt = m.get(sales[i]);
            		cnt++;
            		m.put(sales[i], cnt);
            	} else {
            		m.put(sales[i], 1);
            	}
            }
        	List<Integer> keySetList = new ArrayList<>(m.keySet());
        	
    		Collections.sort(keySetList, (o1, o2) -> (m.get(o1).compareTo(m.get(o2))));
    		
            return keySetList.get(n-1);
        }
    
        public static void main(String[] args) {
            int x = nthLowestSelling(new int[] { 5, 4, 3, 2, 1, 5, 4, 3, 2, 5, 4, 3, 5, 4, 5 }, 2);
            System.out.println(x);
        }
    }

    댓글

Camel`s Tistory.