Java/Short 개발

[Java/Short] 카운트 Array/Map 구현방법: Counting Array, Counting Map

adjh54 2023. 5. 13. 13:23
반응형
해당 글에서는 Counting 배열과 Map을 구현하는 방법에 대해서 이해를 돕기 위해 작성한 글입니다.


 
 

1) Counting 배열 구성 : Array를 이용한 방법


 💡 Counting 배열 구성방법

- 배열의 요소 값에 따라 새로운 배열에 인덱스 위치와 매칭하여 각각을 Counting 하는 새로운 배열을 구성합니다.

1. 배열의 요소의 최대값에 맞게 배열을 새로 정의합니다.
2. Counting 배열을 구성합니다 : 배열을 순회하면서 요소의 값과 인덱스가 같은 경우 값을 1을 더합니다.
// 개수를 확인하려는 배열
int[] arr = {1, 3, 2, 5, 4, 5, 2, 3};

// [STEP1] 배열의 요소의 최대값에 맞게 배열을 새로 정의합니다.
Arrays.sort(arr);
int max = arr[arr.length - 1];
int[] countingArr = new int[max + 1];

// [STEP2] Counting 배열을 구성합니다 : 배열을 순회하면서 요소의 값과 인덱스가 같은 경우 값을 1을 더합니다.
for (int i = 0; i < arr.length; i++) {
    for (int j = 0; j < countingArr.length; j++) {
        if (arr[i] == j) countingArr[j] += 1;
    }
}
System.out.println("Counting Arr ::" + Arrays.toString(countingArr)); // Counting Arr :: [0, 1, 2, 2, 1, 2]

 

💡 Arrays.fill()을 이용하여 0의 배열을 구성하여 Counting 배열에 각각의 값을 1씩 더하여 Counting 배열을 만듭니다.
int[] arr = {1, 3, 2, 5, 4, 5, 2, 3};

int[] fillArr = new int[11];
Arrays.fill(fillArr, 0); // [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

for (int arrItem : arr) {
    for (int i = 0; i < fillArr.length; i++) {
        if (arrItem == i) {
            fillArr[i] += 1;
        }
    }
}

System.out.println("fill Array : " + Arrays.toString(fillArr)); // fill Array : [0, 1, 2, 2, 1, 2, 0, 0, 0, 0, 0]

 


 
 
 
 

2) Counting Map 구성 : Map을 이용한 방법


 

1. 주요메서드


 

1.1. getOrDefault(Object key, V defaultValue)

💡 getOrDefault(Object key, V defaultValue) 란?

- 주어진 key에 대응하는 값이 존재하면 그 값을 반환하고 그렇지 않으면 defaultValue 값을 반환합니다.
매개변수 설명
key 찾으려는 값의 키
defaultValue 찾으려는 값이 존재하지 않을 때 반환할 값
HashMap<String, Integer> map = new HashMap<>();
map.put("apple", 1);
map.put("banana", 2);
map.put("orange", 3);

System.out.println(map.getOrDefault("apple", 0)); // 1
System.out.println(map.getOrDefault("grape", 0)); // 0

 
 

1.2. Map.Entry<>

 💡 Map.Entry란?

- Java에서 Map.Entry는 일반적으로 Map 인터페이스를 사용할 때 함께 사용됩니다.
- Map 인터페이스에서 제공하는 키-값 쌍을 표현하기 위해 사용됩니다. 따라서 getKey()와 getValue() 메서드를 사용하여 해당 Map.Entry 객체의 키와 값을 가져올 수 있으며, setValue() 메소드를 통해서 값을 지정이 가능합니다.
메서드 설명
getKey() 이 Entry에 대한 키 반환
getValue() 이 Entry에 대한 값 반환
setValue(V value) 이 엔트리의 값을 주어진 값으로 설정

 
 

💡 Map.Entry를 사용하여 Map 인터페이스를 반복하면서 각각의 키-값 쌍을 출력하는 예시입니다.
Map<String, Integer> map = new HashMap<>();
// Map에 데이터 추가
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);

// Map.Entry를 사용하여 Map 반복
for(Map.Entry<String, Integer> entry : map.entrySet()) {
    System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}

 

[ 더 알아보기 ]

💡Map과 Map.Entry는 무슨 차이 인가?

- Map과 Map.Entry는 모두 자바 컬렉션 프레임워크에서 사용되는 인터페이스입니다.

- Map은 “키-값 쌍으로 이루어진 데이터를 저장하고 관리”하는 데 사용되며 중복된 키를 허용하지 않습니다
- Map.Entry는 Map 인터페이스에서 사용되는 내부 인터페이스로, Map에 저장된 키-값 쌍을 나타냅니다. Map 인터페이스에서 제공되는 메서드 중 일부는 Map.Entry 인터페이스를 반환합니다.

- 이를 통해 Map에 저장된 “키-값 쌍을 쉽게 처리”할 수 있습니다.

- 결론적으로 Map은 데이터를 “저장하고 관리”하는 데 사용되고, Map.Entry는 “Map에서 사용되는 키-값 쌍을 처리”하는 데 사용됩니다.

 
 

2. 구현


💡 Counting Map 구성방법

1. Key, Value가 Integer 값인 Map을 선언합니다.

2. 반복문을 순회하면서 key는 요소 값으로 지정하며, value는 키와 동일한 값이면 0을 반환하며 이외에 경우에는 +1을 더합니다. (해당 과정을 통해 이미 존재하는 키값에 +1이 되어 새로운 값으로 대체가 됩니다.)
int[] intArr = {1, 3, 2, 5, 4, 5, 2, 3};

// [STEP1] Key, Value가 Integer 값인 Map을 선언합니다.
Map<Integer, Integer> countingMap = new HashMap<>();

// [STEP2] 반복문을 순회하면서 key는 값으로 지정하며, value는 키와 동일한 값이면 0을 반환하며 이외에 경우에는 +1을 더합니다
for (int intArrItem : intArr) {
    countingMap.put(intArrItem, countingMap.getOrDefault(intArrItem, 0) + 1);
}

System.out.println("countingMap :: " + countingMap); // CountingMap :: {1=1, 2=2, 3=2, 4=1, 5=2}

 
 
 

3. 활용방안


3.1. CountingMap Sort

💡 Map.Entry를 통해서 키와 값에 대한 이용이 가능하기에 이를 사용합니다.
List<Map.Entry<Integer, Integer>> entryList = new ArrayList<>(countingMap.entrySet());

// 값을 기반으로 Map 정렬을 수행합니다
entryList.sort((o1, o2) -> o2.getValue().compareTo(o1.getValue()));

System.out.println("entryList :: "+ Arrays.toString(entryList.toArray())); // entryList :: [2=2, 3=2, 5=2, 1=1, 4=1]

 
 

3.2. 값 추출

 💡 반복문을 수행하면서 키와 값을 출력합니다.
for (Map.Entry<Integer, Integer> entry : entryList) {
    System.out.println("key :: " + entry.getKey() + " value :: " + entry.getValue());
}

 
 

 

4) 참고


💡 해당 문제에 적용하고 활용해 보았습니다.
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 
 
 
오늘도 감사합니다. 😀
 
 

반응형