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

김원기·2025년 2월 7일

코딩테스트

목록 보기
21/21

이번에는 아주 유명?한 문제를 풀어볼 예정이다.
https://school.programmers.co.kr/learn/courses/30/lessons/42576?language=java#

문제

해당 문제에서 가장 중요한 부분은 참가자 중 동명이인이 존재할 수 있다 이 부분이다.

3번 예시에 동명이인이 존재하고 둘중 한 명만 완주에 성공한 것을 볼 수 있다.

그리고 이 문제의 태그에 해시가 붙어있는데 해시의 대표적인 예시 문제로 유튜브에 많이 보였다.

해시와 동명이인 처리 부분을 주의깊게 보고 문제를 풀어보자

풀이

해시맵 생성

먼저 해시맵을 생성할 예정이다.
HashMap<String, Integer> completMap = new HashMap<>();

해당 맵은 "이름" : 몇명 의 Key : Value 의미를 담은 맵이다
몇명인지 저장함으로써 동명이인의 유무를 파악할 수 있다.

완주한 선수 명단

이제 완주한 선수 명단을 맵에 저장할 예정이다.

for (String com : completion) {
    completMap.put(com, completMap.getOrDefault(com, 0) + 1);
}

완주자 명단만을 순회하여 생성해둔 맵에 저장한다.

이 때 사용되는 것이 바로 getOrDefault인데 completMap.getOrDefault(com, 0)

딱 이 부분을 분해 해보면 다음과 같이 풀 수 있다.

get(com) 을 진행해서 Value가 나온다면 그 값을 사용하고,
get(com) == null 일 경우에는 0으로 저장할게

따라서 위의 코드는 이미 존재하는 코드
completMap.put(com, completMap.getOrDefault(com, 0) + 1);
를 풀어보자면

중복된 이름 없이 처음 들어온 주자는 "이름" : 0 + 1 로 저장하고,
중복된 이름이 있다면 "이름" : 1 + 1 로 저장한다.

완주하지 못한 주자 찾기

이제 참가자를 순회하면서 완주하지 못한 주자를 찾아야 한다.

for (String part : participant) {
    completMap.put(part, completMap.getOrDefault(part, 0) - 1);

    if (completMap.get(part) == 0) {
        completMap.remove(part);
    }
}

해당 부분에 대한 코드는 위에서 설명을 다 했기 때문에 굳이 더 하지 않도록 하겠다.

전체 코드

import java.util.*;

class Solution {
    public String solution(String[] participant, String[] completion) {
        HashMap<String, Integer> completMap = new HashMap<>();

        // 완주한 선수 명단을 맵에 저장
        for (String com : completion) {
            completMap.put(com, completMap.getOrDefault(com, 0) + 1);
        }

        // 참가자를 순회하며 완주하지 못한 사람 찾기
        for (String part : participant) {
            completMap.put(part, completMap.getOrDefault(part, 0) - 1);

            // 값이 0이 되면 제거
            if (completMap.get(part) == 0) {
                completMap.remove(part);
            }
        }

        // 완주하지 못한 선수는 유일하게 맵에 남아있는 key
        return completMap.keySet().iterator().next();
    }
}
profile
혼자 공부하는 블로그라 부족함이 많아요 https://www.notion.so/18067a27ac7e4f4790dde645fb3bf3d3?pvs=4

0개의 댓글