프로그래머스 완주하지 못한 선수[자력]

작성자 : 조회수 :

소요시간 20

 

문제 테마 자체가 해시라고 나와있어서 바로 풀수 있었습니다.

 

해시를 사용한 기본적인 방법이라고 생각이 듭니다.

아이디어는 주석에도 있지만 이렇습니다

 

1.     완주자 명단을 중복된 이름을 고려하여 로 담아둡니다.

2.     String은 이름이 될것이고 Integer value는 동명이인을 생각한 이름의 개수입니다.

3.     완주자 명단 리스트를 순회하며 소거해나갑니다. Value1이면 remove합니다.

4.     이를 반복해서 최종적으로 하나남은 이름을 반환합니다.

 

package Question;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

/** *

 * 완주하지 못한 선수

 * https://school.programmers.co.kr/learn/courses/30/lessons/42576

 *

 * 아이디어

 * 1. HashMap 사용하되 중복요소가 있을 있음 -> 그래서 요소를 스택으로 해서 만들어두자

 * 2. Hash 명단을 key 담아두고 중복된 수는 value 개수로 담아둡니다.

 */

public class NotFinishRunner {

    public static void main(String[] args) {

    }

    public String solution(String[] participant, String[] completion) {

        String answer = "";

        HashMap<String, Integer> participantMap = new HashMap<>();

        for (String i : participant){

            if(participantMap.isEmpty()){

                participantMap.put(i, 1);

            }else if(participantMap.containsKey(i)){

                participantMap.put(i , participantMap.get(i)+1);

            }else{

                participantMap.put(i , 1);

            }

        }

        for (String i : completion){

            if(participantMap.containsKey(i)){

                if(participantMap.get(i) > 1){

                    participantMap.put(i , participantMap.get(i)-1);

                }else{

                    // 값이 있는데 1이면 완전삭제

                    participantMap.remove(i);

                }

            }

        }

        // Entry 리스트

        List<HashMap.Entry<String, Integer>> entryList = new ArrayList<>(participantMap.entrySet());

        for (HashMap.Entry<String, Integer> entry : entryList) {

           answer = entry.getKey();

        }

        return answer;

    }

}