알고리즘/프로그래머스

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

Ellie67 2021. 6. 26. 01:44

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

 

코딩테스트 연습 - 완주하지 못한 선수

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

programmers.co.kr

 

해시를 사용해야 하는 문제 같지만 어려워서 그냥 풀었다.

정렬을 사용하면 성능이 좋지 않을 것 같기에 해시를 이용하는 법을 익혀야 할 것 같다.

그래서 해시로 푸는 법도 확인해보려고 한다.

 

[이클립스 코드]

import java.util.Arrays;

public class Main {
	
	public static String solution(String[] participant, String[] completion) {
		Arrays.sort(participant);
		Arrays.sort(completion);
		
		int i;
		
		for(i=0; i<completion.length; i++) {
			if(!participant[i].equals(completion[i])) {
				return participant[i];
			}
		}
		return participant[i];
    }
	
	public static void main(String args[]){
		String[] participant = {"marina", "josipa", "nikola", "vinko", "filipa"};
		String[] completion = {"josipa", "filipa", "marina", "nikola"};
	    System.out.println(solution(participant, completion));
	}
}

 

 

프로그래머스에서 좋아요를 가장 많이 받은 분의 코드이다.

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;
    }
}

 

getOrDefault(key, defaultValue): map에서 찾는 Key가 없다면 defaultValue를 리턴

 

// participant 배열의 모든 값을 해시 맵에 넣음
for (String player : participant) 
    // key = player, value = 현재 맵에 저장된 문자열 개수 +1
	hm.put(player, hm.getOrDefault(player, 0) + 1);
// completion 배열의 모든 값을 해시 맵에 넣음
for (String player : completion) 
	// 맵에 있는 같은 문자열을 찾아서 value 값 -1 
	hm.put(player, hm.get(player) - 1);

https://codevang.tistory.com/289 읽어보니 아래 부분을 수정할 필요가 있다고 한다.

Key 값만 Set으로 가져오는게 아니라 Entry 객체 자체를 Set으로 가져오도록.

entrySet() : 엔트리 객체로 이루어진 Set을 리턴

이렇게 하면 더 이상 해시 맵에서 데이터를 찾을 필요 없이 순서대로 value 값을 확인하면 된다.

// 수정 전
for (String key : hm.keySet()) {
            if (hm.get(key) != 0){
                answer = key;
            }
        }
 
 
// 수정 후
for (Entry<String, Integer> entry : map.entrySet()) {
			if (entry.getValue() > 0) {
				answer = entry.getKey();
				break;
			}
		}