Today I Learned

[프로그래머스] 해시 Level 1. 완주하지 못한 선수 (JAVA) 본문

알고리즘 & 코딩테스트

[프로그래머스] 해시 Level 1. 완주하지 못한 선수 (JAVA)

하이라이터 2021. 1. 18. 02:33
728x90


2중 포문으로 돌리면 당연히 안되고, 해시 문제라서 해시를 사용했다.

participant 배열을 돌면서 pHash에 (이름, 인원)으로 참가자를 더한다. 동명이인 때문에 인원 값이 들어간다.

그리고 completion 배열을 돌면서 인원을 한명씩 줄인다.

결과값 찾을때 한번 더 체크하기싫어서 인원이 0이 되면 해시에서 아예 지워버렸다. 

 

처음에는 if문으로 해시에 값이 존재하는지 체크해서 참가자를 더했는데,

값이 없을 시 자동으로 default 값 셋팅해주는 getOrDefault라는 함수가 있더라.

 

코드

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

class Solution {
    public String solution(String[] participant, String[] completion) {
        Map<String, Integer> pHash = new HashMap<>();
        for(String p : participant) {
            pHash.put(p, pHash.getOrDefault(p,0)+1);
        }
        
        for(String c : completion) {
            Integer j = pHash.get(c)-1;
            if(j == 0) pHash.remove(c);
            else pHash.put(c, j);
            
        }
        return pHash.keySet().iterator().next();
    }
}

결과


다른 사람들 풀이를 찾아보니 그냥 정렬한 다음에 배열끼리 비교해버리는 방법도 쓰더라.

성능 상 차이가 있나  싶어서 비교해봤는데 그냥 해시 쓰는게 나은거같다.

점수는 똑같이 만점 나오는데 실제 수행 시간은 꽤 차이가 난다.

정렬하면서 시간을 너무 많이 잡아먹는듯. 코드 수는 줄었는데....

 

코드

import java.util.Arrays;

class Solution {
    public String solution(String[] participant, String[] completion) {
        Arrays.sort(participant);
        Arrays.sort(completion);
        
        for(int i = 0; i <completion.length; i++){
            if(!participant[i].equals(completion[i]))
                return participant[i];
        }
        return participant[participant.length-1];
    }
}

결과

 

728x90
Comments