import java.util.*;
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
HashMap<String , Integer> map = new HashMap<>();
for (String player : participant){
map.put(player , map.getOrDefault(player,0)+1);
}
for (String player : completion){
map.put(player , map.get(player)-1);
}
Iterator<Map.Entry<String,Integer>> iter = map.entrySet().iterator();
while (iter.hasNext()){
Map.Entry<String,Integer> entry = iter.next();
if (entry.getValue() != 0){
answer = entry.getKey();
}
}
return answer;
}
}
- HashMap<String , Integer> map = new HashMap<>(); -
HashMap생성 : key값은 String , Value값은 Integer
- for(String player : participant){map.put(player , map.getOrDefault(player,0)+1);} -
참가한 선수들의 이름을 key값으로 val값을 +1을 해준다
이 과정에서 이름이 2번있는 동명이인은 val값이 2로 셋팅된다.(+1이 두번되기 때문)
- map.put(key , value) -
map에 key,value값을 할당하는 메서드
- mpa.getOrDefault() -
지정된 키로 맵핑된 val값이 없는 경우 기본 val값을 설정해준다.
for (String player : completion){map.put(player , map.get(player)-1);}
완주한 선수들의 이름을 key값으로 val값을 -1해준다
이 과정에서 완주하지 못한 선수는 val값이 -1 되지않기 때문에 val값이 그대로 1이다.
동명이인이 있는 경우 val값이 2에서 -1되기 때문에 val값이 1이다.
- Iterator<Map.Entry<String,Integer>> iter = map.entrySet().iterator(); -
Iteratror의 제네릭스로 Map.Entry를 설정
Map.Entry의 제네릭스는 <키 String , 값 Integer>
map의 데이터를 담고있는 set을 반환 iterator가 값을 하나씩 읽어 Map.Entry에 할당한다.
- Map.Entry<key , val> -
key,val값을 가진 interface
주로 반복문에서 배열의 key , val 값을 모두 확인하기 위해 사용
-.entrySet() -
데이터를 담고있는 set을 반환한다.
map의 key , val 값이 모두 필요한 경우 사용
-Iterator-
컬렉션으로부터 정보를 얻어내는 인터페이스 , 반복자이다.
반복자는 객체지향적 프로그래밍에서 배열이나 그와 유사한 자료구조의 내부요소를 반복하며 순회한다.
while (iter.hasNext())
iter객체 내부에 다음 값이있는 동안 반복한다.
- hasNext()-
해당 iterator가 읽어올 데이터가 남아있으면 true 없으면 false
boolean type을 반환
{Map.Entry<String,Integer> entry = iter.next();
entryt에 iter의 값을 하나씩 읽어오며 할당
- next() -
읽어온 데이터의 다음 데이터를 반환한다.
if (entry.getValue() != 0){answer = entry.getKey();}}
entry에서 가져온 val이 0이 아닐 때 answer에 entry의 key를 할당해서 리턴
//Iterator컬렉션으로부터 정보를 얻어내는 인터페이스
//맵의 key값을 .iterator가 하나씩 읽어 playerKey에 할당한다.
Iterator<String> playerKey = map.keySet().iterator();
//맵의 val값을 .iterator가 하나씩 읽어 playerKey에 할당한다.
Iterator<Integer> playerVal = map.values().iterator();
//.hasNext() : 해당 iterator가 읽어올 데이터가 남아있으면 true 없으면 false
while (playerKey.hasNext()){
//.next() : 읽어온 데이터 다음 데이터를 반환한다.
String key = playerKey.next();
System.out.println(key);
}
while (playerVal.hasNext()){
Integer val = playerVal.next();
System.out.println(val);
}
문제 해결을 위하여
중간 중간 객체 확인하며 작성한 코드
static class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
//String key값 , Integer , Value값을 갖는 HashMap생성
HashMap<String, Integer> map = new HashMap<>();
//참가한 선수들의 이름을 key값으로 val값을 +1을 해준다 이 과정에서 이름이 2번있는 동명이인은 val값이 2로 셋팅된다.(+1이 두번되기 때문)
for (String player : participant) {
//map.put으로 map에 key,value값을 넣을 수 있다.
//mpa.getOrDefault()지정된 키로 맵핑된 val값이 없는 경우 기본 val값을 설정해준다.
map.put(player, map.getOrDefault(player, 0) + 1);
}
//완주한 선수들의 이름을 key값으로 val값을 -1해준다
//이 과정에서 완주하지 못한 선수는 vla-1이 되지않기 때문에 val값이 그대로 1이다.
for (String player : completion) {
map.put(player, map.get(player) - 1);
}
//Iterator컬렉션으로부터 정보를 얻어내는 인터페이스
//Map.Entry: key,val값을 가진 interface
//.entrySet() : 데이터를 담고있는 set을 반환한다.
//map의 데이터를 담고있는 set을 반환해 .iterator가 set의 값을 하나씩 읽어 Map.Entry에 할당한다.
//Iterator의 제네릭스로 Map.Entry가 들어가있어 map.entrySet()과정을 거쳐주는 것 같음 set에대해 공부해볼 필요가 있다.
//아래 과정을 생략하게되면 Map의 값을 읽어올 때 key값을 하나하나 인덱스해줘야한다.
//key값을 따로 Iterator해주거나 , val값을 따로 Iterator해주지 않기위해 통째로 넣어버린다.
Iterator<Map.Entry<String, Integer>> iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry<String, Integer> entry = iter.next();
if (entry.getValue() != 0) {
answer = entry.getKey();
}
}
return answer;
}
}
'Plo Algorithm' 카테고리의 다른 글
프로그래머스 Lv1 자릿수 더하기 (0) | 2022.03.16 |
---|---|
프로그래머스Lv1 이상한 문자 만들기 (0) | 2022.03.16 |
프로그래머스 Lv1 수박수박수박수박수박수? (0) | 2022.03.16 |
프로그래머스 Lv1 서울에서 김서방 찾기 (0) | 2022.03.16 |
프로그래머스Lv1 문자열 다루기 기본 (0) | 2022.03.16 |