본문 바로가기
IT/Algorithm

프로그래머스(Programmers) 완주하지 못한 선수(java)

by flatsun 2019. 8. 20.
반응형

프로그래머스(Programmers)

문제명 : 완주하지 못한 선수

언어 : 자바(java)

 

이 문제에서 포인트는 해시를 이용해서 풀어야 한다는 건데

그걸 모르고 온갖 방법으로 풀다가 효율성을 통과를 못해서 삽질을 오래 했다가

문제에서 해시를 보고 쉽게 풀게 되었다

 

생각나는 해시로는 HashSet과 HashMap이 있는데

HashSet은 중복을 허용하지 않으므로

이름이 중복되는 경우에는 사용하기 힘들어 보이고

 

HashMap도 Key의 중복은 되지 않지만 대신 Value를 변경할 수 있으므로

이름을 Key로 주고 이름이 여러번 들어오면 Value를 올려서 넣어주고

 

Participant 배열을 HashMap 안에 다 넣은 뒤

Completion 배열을 돌려서 Value를 도로 빼주면 되는데

 

Completion 배열은 Participant 배열보다 항상 1 작기 때문에

Map에서 Value가 1인 것을 answer로 넣어 반환하면 되는 것이다

 

내가 푼 방법은 아래와 같은데

 

먼저 HashMap을 만들어 준 후

participant 배열을 map 안에 넣어주는데

 

여기서 containsKey를 사용해 중복되는 이름이 있다면

key는 중복이 안되므로 value를 +1 시켜 넣어준다

 

반면 중복되는 이름이 없으면

이름을 key로 넣어주고, value는 1로 해서 넣어준다

 

이름이 3개라면

key는 한개지만 value는 3

이런 식으로 들어가게 될 것이다

 

다음으로는 completion 배열을 for문으로 돌리면서

map의 value를 감소시켜 주는데

completion 배열은 participant 배열보다 항상 1 작으므로

map에서 value가 1인 값이 answer가 되는 것이다

 

프로그래머스에 바로 적용할 수 있는 답은

아래 코드를 복사 붙여넣기 해주면 된다

import java.util.HashMap;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        
        HashMap<String, Integer> map = new HashMap<String, Integer>();
     // HashMap에 participant 값 넣는 과정
        for(int i = 0; i<participant.length; i++) {
        	if(map.containsKey(participant[i])) { // 이미 같은 값이 있을 경우
        		int counter = map.get(participant[i]); // 누적되는 값은 Key 별로 다르기 때문에 재정의 필요
        		map.put(participant[i], counter + 1); // 값 증가시켜 재삽입 (이전 Key는 없어짐)
        	} else { // 값이 하나밖에 없을 경우
        		map.put(participant[i], 1);
        	}
        }
        
        // Hashmap에 넣은 값을 completion에 맞춰 빼는 과정
        for(int i = 0; i<completion.length; i++) {
        	if(map.containsKey(completion[i])) { // completion 배열에 이전 삽입한 participant 배열와 일치하는 값이 있을 경우
        		int counter = map.get(completion[i]); // 기존 map에 completion 배열 들어있는 값을 넣어주면 counter 숫자가 나옴
        		map.put(completion[i], counter - 1); // -1씩 해준다
        	}
        }
        
        // answer를 찾는 과정
        // participant 배열과 completion 배열은 1 차이가 남
        for(int i = 0; i<map.size(); i++) {
        	if(map.get(participant[i]) == 1) { // Key에 비례한 Value가 1일 경우(1 차이가 나므로 하나만 남았을 것)
        		answer = participant[i]; // answer는 -1 하지 않은 단 하나의 값
        	}
        }
        
        return answer; // 답 반환
    }
}
반응형

댓글