th42500의 TIL

[Java] 해시 - 완주하지 못한 선수(Lv1) 본문

Algorithm/Programmers

[Java] 해시 - 완주하지 못한 선수(Lv1)

th42500 2022. 3. 1. 18:47

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

 

코딩테스트 연습 - 완주하지 못한 선수

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수

programmers.co.kr

 

✔ 입출력 예시 

완주하지 못한 선수 입출력 예

 

 

❓ List와 HashMap의 차이
이 문제는 List로 풀 경우 효율성 테스트에서 통과 ❌ 

✔ List는 원하는 값을 찾기 위해 원하는 값이 담기 인덱스까지 순회를 함 👉 시간복잡도가 최소 O(N) 
✔ HashMap은 Key와 Value로 이루어져 있어 Key를 이용하여 빠른 속도로 원하는 값을 찾을 수 있음 👉 시간복잡도 O(1)

 

 

💡 포인트
1️⃣ HashMap을 사용해서 마라톤 참여(paricipant) 선수이름(key) 별로 명수(value) 저장
2️⃣ 완주한 마라톤 선수(completion) 이름(key)이 겹칠 경우 1️⃣에서 저장한 명수(value)에서 -1씩 해줌
3️⃣ value가 0인 마라톤 선수들은 모두 완주했다는 의미로, value가 0이 아닌 선수들만 answer에 담아서 return

 

 

✔ 소스코드 

package Hash;

import java.util.Arrays;
import java.util.HashMap;

public class marathon {  // 완주하지 못한 선수

    public static void main(String[] args) {
        // BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] participant = {"leo", "kiki", "eden"};
        String[] completion = {"eden", "kiki"};

        System.out.println(solution(participant, completion));
    }

// 프로그래머스에 입력할 답안

    private static String solution(String[] participant, String[] completion) {
        String answer = "";

        Arrays.sort(participant);
        Arrays.sort(completion);

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

        for (String p : participant) {
            map.put(p, map.getOrDefault(p, 0) + 1);  // getOrDefault(가져와야 하는 요소의 키, 매핑된 값이 없는 경우 반환되어야 하는 기본값) 
        }
        for (String p : completion) {
            map.put(p,  map.get(p) - 1);
        }

        for (String key : map.keySet()) {  // map.keySet()
            // System.out.println(String.format("선수명 : %s, 값: %d", key, map.get(key)));
            if(map.get(key) != 0) {
                answer = key;
            }
        }
        return answer;
    }

}
Comments