프로그래머스 완주하지 못한 선수 JAVA 풀이 (HashMap, 해시)

2026. 7. 1. 22:27·코테(Solved.ac + Programmers)
728x90

🔗 문제 링크

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


📌 문제 개요

마라톤 참가자 명단(participant)과 완주자 명단(completion)이 주어진다.

완주자 명단은 참가자보다 한 명 적으며, 완주하지 못한 선수의 이름을 반환하는 문제이다.

 

참가자 중에는 동명이인이 존재할 수 있기 때문에 단순 비교만으로는 해결할 수 없다.


📌 접근 방법

이 문제는 이름의 등장 횟수를 관리하는 것이 핵심이다.

HashMap<String, Integer>를 사용하여 참가자의 이름을 Key, 등장 횟수를 Value로 저장한다.

 

이후 완주자를 순회하면서 해당 이름의 개수를 1씩 감소시키면, 마지막에는 완주하지 못한 선수만 값이 1로 남게 된다.

마지막으로 HashMap을 순회하여 값이 0이 아닌 Key를 반환하면 된다.


📌 핵심 아이디어

1. 참가자의 등장 횟수 저장

  • 이름이 처음 등장하면 1을 저장한다.
  • 이미 존재하는 이름이면 기존 값에 1을 더한다.
  • 동명이인도 정확하게 처리할 수 있다.
map.put(participant[i], map.getOrDefault(participant[i], 0) + 1);

2. 완주자의 등장 횟수 차감

완주한 선수의 개수를 하나씩 감소시킨다.

map.put(completion[j], map.get(completion[j]) - 1);

 

 

leo -> 1
kiki -> 1
eden -> 1

↓

leo -> 1
kiki -> 0
eden -> 0

3. 값이 남아있는 선수가 정답

값이 0이 아니라면 해당 선수가 완주하지 못한 선수이다.

for(String key : map.keySet()){
    if(map.get(key) != 0){
        answer = key;
    }
}

📌 전체 코드

import java.util.HashMap;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";

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

        for(int i = 0; i < participant.length; i++){
            map.put(participant[i], map.getOrDefault(participant[i], 0) + 1);
        }

        for(int j = 0; j < completion.length; j++){
            map.put(completion[j], map.get(completion[j]) - 1);
        }

        for(String key : map.keySet()){
            if(map.get(key) != 0){
                answer = key;
            }
        }

        return answer;
    }
}
 

📄 정리

  • HashMap을 이용한 빈도수 카운팅 문제이다.
  • getOrDefault()를 사용하면 등장 횟수를 간단하게 관리할 수 있다.
  • 완주자는 개수를 감소시키고, 마지막에 값이 남아있는 선수를 찾으면 된다.
  • 동명이인이 존재하는 경우도 정확하게 처리할 수 있다.
  • 시간복잡도는 O(N) 으로 대용량 데이터도 효율적으로 처리할 수 있다.
728x90

'코테(Solved.ac + Programmers)' 카테고리의 다른 글

프로그래머스 PCCE 기출문제 10번 데이터 분석 JAVA 풀이 (구현, 정렬)  (0) 2026.07.03
프로그래머스 체육복 JAVA 풀이 (그리디, 구현)  (0) 2026.07.02
프로그래머스 분수의 덧셈 JAVA 풀이 (수학, 구현, 유클리드 호제법)  (0) 2026.06.30
프로그래머스 로또의 최고 순위와 최저 순위 JAVA 풀이 (완전탐색, 구현)  (0) 2026.06.29
프로그래머스 동영상 재생기 JAVA 풀이 (구현, 시뮬레이션)  (0) 2026.06.28
'코테(Solved.ac + Programmers)' 카테고리의 다른 글
  • 프로그래머스 PCCE 기출문제 10번 데이터 분석 JAVA 풀이 (구현, 정렬)
  • 프로그래머스 체육복 JAVA 풀이 (그리디, 구현)
  • 프로그래머스 분수의 덧셈 JAVA 풀이 (수학, 구현, 유클리드 호제법)
  • 프로그래머스 로또의 최고 순위와 최저 순위 JAVA 풀이 (완전탐색, 구현)
PUSH → MERGE → DEPLOY
PUSH → MERGE → DEPLOY
데이터 흐름과 운영 자동화를 설계하는 백엔드 개발자
  • PUSH → MERGE → DEPLOY
    Coding Dongin
    PUSH → MERGE → DEPLOY
  • 전체
    오늘
    어제
    • MEUN N
      • 코테(Solved.ac + Programmers) N
      • BootCamp(JAVA)
      • JAVA
      • SpringBoot
      • JavaScript
      • JSP
      • DB(SQL)
      • React
      • HTML_CSS
      • jQuery
      • SCSS
      • GSAP
      • 설치 + 꿀팁
      • 정보처리기사 오답노트
      • 정보처리기사 기출문제
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GIT
  • 공지사항

  • 인기 글

  • 태그

    기출문제
    자바
    실기
    정처기
    코딩테스트
    자료구조
    정처기오답노트
    문자열
    solved.ac
    Level2
    dp
    level1
    백준
    시뮬레이션
    springboot
    java
    level0
    완전탐색
    구현
    배열
    정렬
    알고리즘
    수학
    정처기실기
    브루트포스
    백엔드개발자
    피보나치
    정보처리기사 실기 기출문제
    정보처리기사
    프로그래머스
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.4
PUSH → MERGE → DEPLOY
프로그래머스 완주하지 못한 선수 JAVA 풀이 (HashMap, 해시)
상단으로

티스토리툴바