Backend
home
✏️

Day4 (3/13) - 완주하지 못한 선수

생성 일시
2026/03/13 10:21
알고리즘/자료구조 유형
HashMap

문제

마라톤 참가자 목록 participant와 완주한 사람 목록 completion 이 주어진다. 이 중에서 완주하지 못한 선수 1명을 찾는 문제이다.

내가 작성한 답안

/** * === 완주하지 못한 선수 === * [문제 요약] * 마라톤 참가자 목록 paricipant와 완주한 사람 목록 completion 이 주어진다. * 이 중에서 완주하지 못한 선수 1명을 찾는 문제이다. * * [조건] * - 참가자 수: 최대 100,000 * - 동명이인 가능 * * [이 문제의 핵심 알고리즘] * - HashMap Counting * * [사고 과정] * 1. 참가자 카운트 - leo(1), kiki(1), eden(1) * 2. 완주자 제거 - eden, kiki * leo : 1 * kiki : 0 * eden : 0 * => 남은 사람은 leo */ import java.util.*; public class InCompleteRun { public String solution(String[] participant, String[] completion) { Map<String, Integer> map = new HashMap<>(); // 1. 참가자 등록 - 참가 선수 Map에 추가 // map.getOrDefault() - 참가자 카운트 for (String p : participant) { map.put(p, map.getOrDefault(p, 0) + 1); } // 2. 완주자 제거 - 완주한 선수는 해당 map에서 제외 for (String c : completion) { map.put(c, map.get(c) - 1); } // 3. 남은 사람 찾기 - 업데이트 된 map의 key를 순회해서 0보다 크면 return 해준다 for (String key : map.keySet()) { if (map.get(key) > 0) { return key; } } return ""; } }
Java
복사

문제 이해

입력

participant, completion

예시

participant = ["leo", "kiki", "eden"] completion = ["eden", "kiki"]
Java
복사

출력

leo
Java
복사

제약조건

participant 최대 100,000
completion = participant - 1
동명이인 가능

알고리즘 설계

접근

participant에서 completion을 제거
하지만 O(N^2) → 100000이면 시간초과

정렬 전략

participant sort, completion sort

최적화 전략

HashMap Counting
참가자 count + 완주자 count - 남은 사람 = 완주하지 못한 사람
Java
복사

자료구조 선택

HashMap<String, Integer>
Java
복사

시간복잡도

O(N)

Hash + Sum 합 전략 (다른풀이)

참가자 hash 합
모든 참가자의 hashCode() 값을 더한다.
완주자 hash 제거
완주자의 hashCode() 값을 빼준다.
남은 hash 찾기
남은 hash → 완주하지 못한 선수

알고리즘 흐름

hashSum = 참가자 hashCode 합 hashSum -= 완주자 hashCode 남은 hash = 완주하지 못한 선수
Java
복사

오늘의 진행내용 정리

[Day 4] 문제 완주하지 못한 선수 사용 알고리즘 해시맵 카운팅 사용한 자료구조 맵 시간복잡도 O(n) 배운 점 1. map.getOrDefault를 활용하여 key의 value를 증가시켜줄 수 있다. 2. map에 추가된 key를 map.get(c)을 활용하여 해당 map의 value를 감소시켜줄 수 있다. 3. 업데이트 된 map의 key를 순회 -> 0보다 크면 그 key가 곧 완주하지 못한 선수를 의미한다.
C
복사