본문 바로가기
Language/알고리즘 문제풀이

프로그래머스 완주하지 못한 선수 자바 문제풀이

by wakestand 2021. 10. 28.
반응형

 

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

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

programmers.co.kr

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

 

위 문제는 String 배열

participant / completion 을 제공받게 되는데

 

completion 배열은 participant 배열보다

size가 1 작기 때문에

 

participant 배열에서 completion 배열을

모두 빼준 뒤 남는 하나의 key 값을 반환하면 된다

 

문제를 푸는 방법은 다양하겠지만

시간제한이 존재하기 때문에

해시(Hash)를 사용해서 문제를 풀어줘야 한다

 


정답은 아래와 같은데

 

import java.util.*;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        LinkedHashMap<String, Integer> participantMap = new LinkedHashMap<>();
        LinkedHashMap<String, Integer> completionMap = new LinkedHashMap<>();

        // completion을 이름 / 갯수로 변환
        for(int i = 0; i < completion.length; i++) {
            if(!completionMap.containsKey(completion[i])) { // Key 없을 경우(처음 삽입)
                completionMap.put(completion[i], 1);
            } else { // Key 존재할 경우
                completionMap.put(completion[i], completionMap.get(completion[i]) + 1);
            }
        }

        // participant을 이름 / 갯수로 변환
        for(int i = 0; i < participant.length; i++) {
            if(!participantMap.containsKey(participant[i])) { // Key 없을 경우(처음 삽입)
                participantMap.put(participant[i], 1);
            } else { // Key 존재할 경우
                participantMap.put(participant[i], participantMap.get(participant[i]) + 1);
            }
        }

        for(String key : participantMap.keySet()) { // participantMap 전체 조회
            int temp = 0;
            if(completionMap.containsKey(key)) { // completion에 존재할 경우 값 가져오기 이외는 0
                temp = completionMap.get(key);
            }

            if(Objects.equals(participantMap.get(key) - temp, 1)) { // 두 배열 비교해서 1남는 값 찾기
                answer = key;
                break;
            }
        }

        return answer;   
    }
}

 

문제 풀이방법을 한번 보자면 

 

1. for 문을 돌리면서 Map에 두 배열을 넣어준다

for 문을 각각 배열 크기에 맞춰

completion / participant 두 배열을 돌려주면서

 

선언한 Map<String, Integer> 안에

Key(이름)와 Value(갯수)를 넣어준다

 

여기서 중복된 이름이 있기 때문에

containsKey() 메소드를 사용해서

이미 map에 넣어놨는데 동일한 이름이 있을 경우

기존 값에 +1을 해서 다시 put 시킨다

(Map은 동일한 Key로 put 시킬 경우

마지막에 put 한 값으로 Value 고정)

 

for 문을 배열 크기에 맞춰 돌려주면

Map 안에 이름 별 갯수를

넣어줄 수 있게 된다

 

2. 다시 한번 for 문을 돌리면서 배열 차이 계산

이제 이름과 갯수를 가진 Map 두개를 가지고 있으니

participantMap 크기에 맞게 for문을 돌려주면서

 

completion에 없는 값이 있을 수 있으므로

containsKey(값); 을 해서

NULL 일 경우에는 0으로 지정해주고

그 외에는 completionMap에 들어있는 갯수를 끌어와

participantMap의 이름별 갯수에서 빼주면 된다

 

그렇게 for 문을 돌리며 계산을 진행해 주다가

participant는 completion보다

무조건 1 더 크기 때문에

 

계산 후 0이 아닌 1이 떨어진다면

바로 for 문을 break 시키고

해당 1의 Key를 반환시켜주면 된다

반응형

댓글