프로그래머스/Lv. 1

[프로그래머스 코딩테스트] 완주하지 못한 선수(Java)

Sigfriede 2023. 8. 2. 01:00

  문제 설명

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

  마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

 

  제한사항

  • 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
  • completion의 길이는 participant의 길이보다 1 작습니다.
  • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
  • 참가자 중에는 동명이인이 있을 수 있습니다.

 

  입출력 예

participant completion return
["leo", "kiki", "eden"] ["eden", "kiki"] "leo"
["marina", "josipa", "nikola", "vinko", "filipa"] ["josipa", "filipa", "marina", "nikola"] "vinko"
["mislav", "stanko", "mislav", "ana"] ["stanko", "ana", "mislav"] "mislav"
import java.util.*;
class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        Map<String, Integer> map = new HashMap<>();
        Map<String, Integer> map2 = new HashMap<>();
        for (String s: participant) {
            map.put(s, map.getOrDefault(s, 0) + 1);
        }
        for (String s: completion) {
            map2.put(s, map2.getOrDefault(s, 0) + 1);
        }
        for (String key: map.keySet()) {
            if (map2.containsKey(key)) {
                int value = map.get(key);
                int value2 = map2.get(key);
                if (value != value2) {
                    answer = key;
                    break;
                }
            } else {
                answer = key;
                break;
            }
        }
        return answer;
    }
}

  제네릭 타입으로 String과 Integer를 갖는 Map 자료구조의 map과 map2를 생성합니다.

  각각 for-each문이 participant와 completion을 순회하면서 key에는 이름을, value에는 이름의 갯수를 확인하고 삽입합니다. getOrDefault를 이용하여 map에 key(이름)이 없을 경우 항목을 추가하고, 이미 있을 경우에는 value에 1을 더해줍니다.

  for문이 map의 key를 순회하면서 바깥 if문에서 containsKey 메소드를 이용하여 map2에 같은 키가 있는지 확인합니다.

  변수 value와 value2를 생성하고 각각 map과 map2의 value를 할당합니다.

  안쪽 if문에서 value와 value2가 같은지 확인하고, 같지 않다면 answer에 key를 할당하고 break를 이용하여 종료합니다.

  else에서 map의 key가 map2의 key에는 존재하지 않는다면 마찬가지로 완주하지 못했다는 뜻이므로 answer에 key를 할당하고 break를 이용하여 종료합니다.

 

  저는 Map을 두 개 생성하여 각각의 키와 값을 비교했습니다. 그러나 Map을 하나만 생성하고, value를 줄여나가는 식으로 찾을 수도 있습니다. 모든 원소를 순회하며 키의 값을 줄여나가는데, 반복문이 끝났는데도 값이 1이라면 그가 완주하지 못한 선수일 것입니다. 이 풀이가 더 빠르면서 간단합니다.

import java.util.*;
class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        Map<String, Integer> map = new HashMap<>();
        for (String s : participant) {
            map.put(s, map.getOrDefault(s, 0) + 1);
        }
        for (String s : completion) {
            map.put(s, map.get(s) - 1);
        }
        for (String key : map.keySet()) {
            if (map.get(key) > 0) {
                answer = key;
                break;
            }
        }
        return answer;
    }
}