본문 바로가기

Plo Algorithm

프로그래머스 Lv1 완주하지 못한 선수

완주하지 못한 선수

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;
        }
    }