[JAVA] [LEVEL1] 프로그래머스 - 완주하지 못한 선수

반응형

프로그래머스 programmers Level1 완주하지 못한 선수 - java

[문제]

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

[풀이]

처음에는 단순한 문제라고 생각해서 중첩 for 문을 이용하여 문제를 풀었다.
다음과 같은 방법을 생각했다.

  1. 참가자와 완주자를 중첩 for 문을 돌려서 완주자의 경우 참가자배열에서 이름을 "0"으로 바꾼다.
  2. 참가자 배열에서 "0" 이 아닌 문자열이 완주하지 못한 사람이다.

이렇게하는 경우, 기대치에 부합하는 답이 도출되긴 하지만 효율성 테스트에서 시간초과에 걸리고 말았다.

다른 방법을 찾아야 했다. for문을 이용하는 방법은 처음에 정렬(sort)을 해주면 통과하지만,
문제의 구분이 해시로 되어 있어 해시를 이용하는 방법으로 풀어보자.

도저히 답을 도출하기가 힘들어서 검색의 힘을 빌렸다.
Map 의 getOrDefault()를 사용하면 된다.

  1. 참가자를 담을 HashMap 을 선언한다.
    1.1. (key = 이름 , value = 참가자 수) 로 생성한다.
    1.2. 참가자는 동명이인(중복키)이 있을 가능성이 존재하므로, getOrDefault() 를 이용한다.
      getOrDefault() 메소드 이용 : get(key) 값이 없으면 0 으로 설정하되, +1 을 해준다.
           → 이렇게하면 처음 설정부터 기본값(0) +1 로 설정되므로,
               동명이인의 경우 원래 값 + 1 로 참가자 수(value)를 +1 하는 것이 된다. 
       ※ getOrDefault() 사용법 : https://gymdev.tistory.com/39 
  2. 참가자 Map 에서 완주자를 찾아 있으면 value 값을 -1 해준다.
  3. 참가자 Map 에서 value 값이 0 이 아니면 완주하지 못한 사람이다.
 

[java] Map - getOrDefault() 사용법

Map 에서 key 값으로 value 값을 취득하는 경우 get() 메소드를 사용한다. 이때, Map 에서 key 가 존재하면 해당하는 key 의 value 값을 반환하고, 찾는 key 가 없거나 null 이면 null 반환한다. ■ get() 1. 예제

gymdev.tistory.com

 

[java 코드]

import java.util.*;

/**
 * 완주하지 못한 선수
 * @param participant 마라톤에 참여한 선수들의 이름이 담긴 배열
 * @param completion 완주한 선수들의 이름이 담긴 배열
 * @return 완주하지 못한 선수의 이름
 */
public String solution(String[] participant, String[] completion) {
    String answer = "";
    // 참가자Map : key = 이름 , value = 참가자 수
    Map<String, Integer> participantMap = new HashMap<>();
    for (String p : participant) {
        // 동명이인(중복키) 있을 가능성이 존재하므로, defaultValue + 1 로 설정
        participantMap.put(p, participantMap.getOrDefault(p, 0) + 1);
    }
    // 참가자Map 에서 완주자를 찾아 있으면 value 값을 -1 해준다.
    for (String c : completion) {
        participantMap.put(c, participantMap.get(c) - 1);
    }
    // 참가자Map 에서 value 값이 0이 아니면 완주하지 못한 사람이다.
    for (String key : participantMap.keySet()) {
        if (participantMap.get(key) != 0) {
            answer = key;
            break;
        }
    }
    return answer;
}

 

반응형