Algorithm/문제풀이

[프로그래머스#42576] 완주하지 못한 선수

gilbert9172 2024. 8. 16. 13:11

❒ Description


제목 완주하지 못한 선수
링크 https://school.programmers.co.kr/learn/courses/30/lessons/42576
자료구조 선형 (해시)
시간복잡도 O(n + k)


이번 문제는 해시맵을 사용하여 간단하게 해결 할 수 있는 문제인데 다른 풀이에서 
HashMap을 생성할 때 Stream을 이용한 풀이가 있어서 메모.

 

 

 

❒ Map 생성


Code 1

다음과 같은 배열 `"A", "B", "C", "A", "C", "A"`에서 각 요소가 몇 번 나왔는지를 Map 자료구조로 표현할 때

나는 주로 아래와 같이 코드를 작성했다.

Map<String, Integer> counter = new HashMap<>();
for (String name : students) {
	counter.put(name, counter.getOrDefault(name, 0) + 1);
}

  


 

Code 2

근데 이번 문제를 풀면서 다른 풀이에서 Stream API를 사용해서 코드를 작성한 사람을 봤다.

Map<String, Long> players = Arrays.stream(participant)
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

 


Code1과 2는 성능적으로 큰 차이는 없다. 하지만 가독성 면에서는 2가 더 좋은거 같다.

하지만 호환성면에서 본다면 Code2는 Java 8 미만에서 사용할 수 없다.

상황에 맞게 잘 선택해서 쓰면될 듯 싶다. 

 

 

❒ Iterator 사용


for (String c : completions) {
    int left = players.get(c);
    if (left == 1) {
        players.remove(c);	
    } else {
        players.put(c, players.get(c) - 1);
    }
}

return players.entrySet().iterator().next().getKey();

동명이인이 없는 경우는 아예 map에서 키를 삭제해버리는 방식이다.

이렇게 되면 결국 map에는 하나의 key만 남기때문에 Iterator를 사용해서 key를 리턴하면 된다. 

 

 

 

❒ Solution


Code 1

class Solution {
    public String solution(String[] participant, String[] completion) {
        // 1. create counter Map
        Map<String, Integer> players = new HashMap<>();
        for (String player : participant) {
            players.put(player, players.getOrDefault(player, 0) + 1);
        }

        // 2. for loop completion
        for (String completer : completion) {
            if (players.containsKey(completer)) {
                players.put(completer, players.get(completer) - 1);
            }
        }

        // 3. for loop map.keyset
        String answer = "";
        for (String player : players.keySet()) {
            if (players.get(player) > 0) {
                answer = player;
            }
        }
        return answer;
    }
}

 

 

Code2

class Solution {
    public String solution(String[] participant, String[] completion) {
    	Map<String, Long> players = Array.stream(participant)
        	.collect(Collectors.groupingBy(Fuction.identity(), Collectors.counting()));
            
        for (String c : completion) {
        	if (players.get(c) == 1) {
            	players.remove(c);
            } else {
            	players.put(c, players.get(c) - 1);
            }
        }
        
        return players.entrySet().iterator().next().getKey();
    }
}