코딩테스트/프로그래머스

[Java] 프로그래머스 Level 1 : 완주하지 못한 선수

이덩우 2023. 6. 9. 11:08

- 문제설명 & 제한사항

- 예시 & 입출력 예

- 해결과정

  • 해시를 이용하지 않고 이중for문을 통해 푼다면 주어진 제한조건 때문에 최악의 경우 100,000 X 100,000의 시간 복잡도가 발생할 수 있다.
  • HashMap이나 HashSet을 이용해 풀어야 하는데, 동명이인이 있을 수 있다는 점에서 HashSet으로는 문제를 풀 수 없었다.
  • 따라서 HashMap에 <선수이름, 동명이인의 수> 형식으로 데이터를 저장하고, 이후 완주자의 배열을 하나씩 불러오면서 동명이인이 없었다면 HashMap에서 아예 지워버리고, 동명이인이 있다면 동명이인의 수를 하나씩 빼주어 업데이트 해주는 방식으로 진행했다.
  • 마지막엔 결국 완주하지 못한 단 한명의 선수가 HashMap에 남게되는데, 해당 키값을 빼오기 위해서 keySet() 메소드를 활용했다. 해당 메소드는 키값을 전부 모아 Set자료형으로 반환시키므로 요구하는 반환타입인 String으로 변환시키기 위해 Set --> List --> String의 변환작업이 필요하지만 그냥 Iterator를 이용해서 바로 반환시켜줬다. (Set안의 요소를 String으로 바로 반환) 

- 솔루션

import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;

class Solution {
    public String solution(String[] participant, String[] completion) {
       
        Map<String, Integer> map = new HashMap<>();
        for(int i = 0; i < participant.length; i++) {
            map.putIfAbsent(participant[i], 0);
            map.put(participant[i], map.get(participant[i]) + 1);
        }  // 이름이 각각 몇번 불렸는지에 대한 해시맵 완성
        
        for(int i = 0; i < completion.length; i++) {
            map.put(completion[i], map.get(completion[i]) - 1);
            if(map.get(completion[i]) == 0) map.remove(completion[i]);
        } // 불린거 맵에서 지우기 --> 최종 남는 하나만 찾으면 된다.
        
        Iterator<String> iter = map.keySet().iterator();
        return iter.next();
    }
}

- 배운점

  • Iterator를 사용하는 이유에 대해 알게되었다. 배열이나 리스트의 경우 인덱스를 가지고있어 사실 for문이나 for-each문으로 같은 결과를 얻어올 수 있지만, Set의 경우 인덱스가 존재하지 않아 내부 요소를 하나씩 출력하고 싶다면 Iterator를 사용해야했다.