[문제]
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 reuturn 하도록 하는 함수 작성
completion의 길이는 participant의 길이보다 1 작으며, 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져있고 동명이인이 있을 수 있음
ex)
participant = ["leo", "kiki", "eden"]
completion =["kiki", "eden"]
결과 : "leo"
participant = ["mislav", "josipa", "nikola", "mislav"]
completion =["mislav","josipa", "nikola"]
결과 : "mislav"
[풀이]
import java.util.*;
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
Map<String,Integer> map = new HashMap<>();
for(String name : participant){
if(map.containsKey(name)){
int count = (int)map.get(name);
map.put(name,count+1);
}else{
map.put(name,1);
}
}
for(String name : completion){
if(map.containsKey(name)){
int count = (int)map.get(name);
map.put(name,count-1);
}else{
map.put(name,1);
}
}
for(String key : map.keySet()){
if(map.get(key)>0){
answer = key;
}
}
return answer;
}
}
[개념 복습]
1.Collection
- 데이터 집합, 그룹을 의미. 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합.
- 주요 인터페이스 : List, Set, Map
2. Map
키와 값(key, value)을 하나의 쌍으로 저장하는 방식 사용. 리스트나 배열처럼 순차적으로 해당 요소 값을 구하지 않고 key를 통해 value를 얻는다. 이때 key는 중복을 허용하지 않으며 value는 중복을 허용한다.
1) 주요 구현체
- HashMap : key에 대한 입력 순서를 보장하지 않으며, 중복 key를 허용하지 않음
- LinkedHashMap : key에 대한 입력 순서를 보장하며, 중복 key를 허용하지 않음
- TreeMap : Red-Black Tree를 기반으로 key & value 저장함. 입력한 key데이터의 크기가 비교 가능한 경우 오름차순으로 정렬되며, 입력하는 데이터가 사용자 정의 객체인 격ㅇ우 Comparable을 구현하여 정렬 기준 설정 가능함
2) 메소드 정리
- put(K key, V value) : 키와 값을 저장하는 메소드로 키가 존재 시 새 값으로 대체됨
- get (K key, V value) : 지정된 키에 대응하는 값을 반환하는 메소드로 만약 키가 없으면 null을 반환함
- remove(Object key) : 키와 그에 대응하는 값 제거
- containsKey(Object key) / containsValue(Object key) : map에 지정된 키 or 값이 존재하는지에 대한 여부를 반환함
- size() : Map에 저장된 key-value쌍의 개수 반환
Map<String, Integer> map = new HashMap<>();
map.put("apple", 50);
map.put("banana", 30);
int price = map.get("apple"); //50
map.remove("banana");
boolean hashApple = map.containsKey("apple"); // true
boolean hashPrice = map.containsValue(50); // true
int size = map.size(); // 1
- keySet() : Map에 모든 키를 담은Set을 반환
- entrySet() : Map의 모든 key-value 데이터 꺼내야 할 때 사용하는 메소드로 Map의 데이터를 담고 있는 Set을 반환함. 반환한 Set의 값이 사용할 데이터 타입은 Map.Entry (인터페이스)이며, getKey(), getValue() 를 사용해 key, value 조회할 수 있음
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "apple");
map.put(2, "banana");
map.put(3, "orange");
Set<Integer> keySet = map.keySet();
for(Integer key : keySet){
System.out.println(key + " : " + map.get(key));
}
/*결과
1 : apple
2 : banana
3 : orange
*/
for (Map.Entry<Integer,String> entry : map.entrySet()){
System.out.println(entry.getKey() + " : " + entry.getValue());
}
//결과: apple : 50
- getOrDefault( Object key , V defaultValue) : 키에 대응하는 값을 반환하고 만약 키가 존재하지 않는다면 defaultValue값을 반환
- putIfAbsent(K key, V value) : 키에 대응하는 값이 없을때만 key - value 데이터 map에 저장
- replace(K key, V value) : Map에 지정된 key가 있으면 그에 대응하는 값으로 대체함
- replaceAll()(BiFunction<> super K, > super V, ? extends V> function) : Map의 모든 key-value 쌍에 대해 지정된 함수를 적용하여 값을 대체
int price = map.getOrDefault("orange", 0); // 0
map.putIfAbsent("apple", 60);
map.replace("apple", 70);
map.replaceAll((key, value) -> value + 10);
예제)
public class MapTest{
public static void main(String[] args){
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("one",1);
map.put("two",2);
map.put("three",3);
map.put("four",4);
System.out.println(map.get("one"));
System.out.println(map.get("two"));
System.out.println(map.get("three"));
iteratorUsingForEach(map);
iteratorUsingIterator(map);
}
static void iteratorUsingForEach(HashMap map){
Set<Map.Entry<String, Integer>> entries = map.keuSet();
for(Map.Entry<String, Integer> entry : entries){
System.out.println(entry.getKey() + " : " + entry.getValue());
}
}
static void iteratorUsingIterator(HashMap map){
Set<Map.Entry<String, Integer>> entries = map.entrySet();
Iterator<Map.Entry<String, Integer>> it = entries.iterator();
while(it.hasNext()){
Map.Entry<String, Integer> entry = it.next();
System.out.println(entry.getKey() + " : " + entry.getValue());
}
}
}
출처: https://school.programmers.co.kr/learn/courses/30/lessons/42576
'복습' 카테고리의 다른 글
[코딩테스트 - 7일차] 같은 숫자는 싫어 (스택/큐) (0) | 2024.08.19 |
---|---|
[코딩테스트 - 6일차] 해시) 폰켓몬 (0) | 2024.08.13 |
[코딩테스트 - 4일차] 문자열을 정수로 바꾸기 (0) | 2024.08.12 |
[코딩테스트 - 3일차] 문자열 내 p와 y의 개수 비교 (0) | 2024.08.06 |
[코딩테스트 - 2일차] 정수를 담고 있는 배열 평균 구하기 (0) | 2024.08.06 |