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) 참고
💡 해당 문제에 적용하고 활용해 보았습니다.
오늘도 감사합니다. 😀
반응형