개발 공부/코딩테스트

99클럽 코테 스터디 11일차 TIL - 해시

죽밥죽밥화이팅 2024. 11. 8. 02:27

문제

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

문제 링크:  https://school.programmers.co.kr/learn/courses/30/lessons/42576

해결 방법

  • Arrays.sort를 통해 두 배열을 정렬
    • 이름이 순서대로 정렬되므로 같은 이름이 같은 위치에 놓이게 됩니다.
  • for 문을 사용하여 참가자 배열과 완주자 배열을 하나씩 비교하고 비교 중 다른 이름이 그 이름을 반환
  • 만약 completion 배열과 모두 일치한다면, participant 배열의 마지막 사람을 반환


코드

import java.util.Arrays;

class Solution {
    public String solution(String[] participant, String[] completion) {
        // 1. 참가자와 완주자 배열을 정렬
        Arrays.sort(participant);
        Arrays.sort(completion);
        
        // 2. 정렬된 배열을 순차적으로 비교하여 다른 이름을 찾기
        for (int i = 0; i < completion.length; i++) {
            if (!participant[i].equals(completion[i])) {
                return participant[i];
            }
        }
        
        // 3. 만약 모두 일치하면 마지막 참가자가 완주하지 못한 사람임
        return participant[participant.length - 1];
    }
}

 


 

  • 참고할 다른 풀이 방법
더보기
import java.util.HashMap;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        HashMap<String, Integer> hm = new HashMap<>();
        for (String player : participant) hm.put(player, hm.getOrDefault(player, 0) + 1);
        for (String player : completion) hm.put(player, hm.get(player) - 1);

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

 

 

import java.util.Arrays;
import java.util.Iterator;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

class Solution {
    public String solution(String[] participant, String[] completion) {

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

        for(String name : completion) {

            Long value = participantMap.get(name) - 1L;

            if(value == 0L) {
                participantMap.remove(name);
            } else {
                participantMap.put(name, value);
            }
        }

        return participantMap.keySet().iterator().next();
    }
}