프로그래머스 Hash > 완주하지 못한 선수 [자바, JAVA]

: ) YOUNG·2021년 11월 3일
2

알고리즘

목록 보기
18/422
post-thumbnail

문제: https://programmers.co.kr/learn/courses/30/lessons/42576?language=java

HashMap을 사용한 코드

    public String solution(String[] participant, String[] completion) {
        String answer = "";
        // 1. HahsMap을 생성한다. (participant 기준)
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        for(String player : participant) {
            // map에 player를 key로 추가한다.
            // 동명이인이 있을 수 있기때문에 같은 key가 있을 경우에는 value에 1을 더하도록 한다.
            // 위의 경우를 해결하기 위해 getOrDefault를 사용한다. 
            // 이전에 없었으면 0으로 만들어줌 그런데 뒤에서 + 1을 붙여서 value를 1로 만들어줌
            map.put(player, map.getOrDefault(player, 0) + 1);
        }
       
        // 2. HashMap을 뺀다 (completion 기준)
        for(String player : completion) {
            map.put(player, map.get(player) - 1);
        }
       
        // 3. value가 0이 아닌 값이 마지막 주자가 되기때문에 그 값을 찾는다
        for(String key: map.keySet()) {
            if(map.get(key) != 0) {
                answer = key;
                break;
            }
        }

        // EntrySet 사용 경우
        Iterator<Map.Entry<String, Integer>> iter = map.entrySet().iterator();

        //iterator.hasNext()는 다음 값이 있는지 없는지 확인하는 메소드
        while(iter.hasNext()) {
            Map.Entry<String, Integer> entry = iter.next();
           
            if(entry.getValue() != 0) {
                answer = entry.getKey();
                break;
            }
        }
        return answer;
    }

정렬 후 Loop를 사용했을때

진짜 의외로 정렬만 잘해도 많은 알고리즘을 해결할 수 있다.

    public String solution(String[] participant, String[] completion) {
        //1. 배열을 정렬(sort) 한다.
        Arrays.sort(participant);
        Arrays.sort(completion);

        //2. 두 배열이 다를 때 까지 찾는다.
        // 정렬이 진짜 은근히 많은 정보를 찾고 효율을 올릴 수 있다.
   
        //⭐⭐완주하지 못한선수가 마지막일 경우의 예외처리를 해줘야 함
        // for(int i=0; i<completion.length; i++) {
        //     if(!participant[i].equals(completion[i])) {
        //         return participant[i];
        //     }
        // }

        int i = 0;
        for(;i<completion.length; i++) {
            // participant의 i번째와 completion의 i번째의 값이 같지 않다면 그 값이 완주하지 못한사람이 된다.
            if(!participant[i].equals(completion[i])) {
                break;
            }
        }

        //3. 전체를 모두 반복했는데도 찾지 못했다면, 마지막 주자가 완주하지 못한 선수다
        return participant[i];
    }

0개의 댓글