ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [자바(JAVA)] 완주하지 못한 선수 /Arrays.sort(), equals(),HashMap, getOrDefault()
    카테고리 없음 2023. 6. 20. 14:26
    728x90

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

     

     

     

    ✅ 내 풀이

     

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

    두 배열을 오름차순으로 정렬 후 인덱스별로 비교하여 값을 확인했다.

    불일치가 나오면 그 인덱스의 participant[]값을 반환하고, 만약 완주하지 못한 사람이 가장 마지막 인덱스에 위치할 경우 answer = ""라서 마지막 인덱스를 반환한다.

     

    이 코드를 작성하는데 상당한 시간이 걸렸고, 추후에 확인해보니 이 코드를 더 간단하게 줄이는 방법이 있었다.

     

     

    ✅ 다른풀이 (1)_ return문 적절히 활용하기

     

    import java.util.*;
    class Solution {
        public 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];
        }
    }

    for문에서 만족하는 값을 바로 return 시키고 for문을 만족하지 않는, 즉 가장 마지막에 원하는 값이 있을 경우

    이미 for문에서 전역변수 i++이 진행되었기 때문에 가장 마지막 인덱스를 반환하게 된다.

     

    ex) completion.lengrh() = 3일때
    for문은 총 3번 진행됨
    i = 0이고 i++진행( 0 -> 1) 
    i = 1이고 i++진행( 1 -> 2) 
    i = 2이고 i++진행( 2 -> 3) 

    return participant[3];

     

     

     

     

     

    ✅ 다른풀이 (2)

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

     

     

     

    HashMap 사용

    1. HashMap<String, Integer> hm: 참가자의 이름과 개수를 저장하기 위한 해시 맵입니다
    2. .hm.put(player, hm.getOrDefault(player, 0) + 1): participant 배열을 순회하면서 각 참가자의 이름을 키로 하고, 이미 존재하는 경우 해당 값에 1을 더하고, 존재하지 않는 경우 0을 반환하여 1을 더한 값을 저장합니다. 이를 통해 각 참가자의 이름과 개수가 hm에 저장됩니다
    3. .hm.put(player, hm.get(player) - 1): completion 배열을 순회하면서 각 완주자의 이름을 키로 하고, 해당 값을 1씩 감소시킵니다. 이렇게 함으로써 완주자는 개수가 0이 되도록 처리됩니다.hm.keySet(): hm의 모든 키(참가자의 이름)를 가져옵니다
    4. .hm.get(key): 특정 키에 해당하는 값을 가져옵니다.if (hm.get(key) != 0): 해당 참가자의 개수가 0이 아닌 경우, 즉 완주하지 못한 참가자인 경우입니다
    5. .answer = key: 완주하지 못한 참가자의 이름을 answer에 할당합니다.

    즉, 처음에는 hm에 participant값을 key에 저장하고 getOrDefault를 이용하여 해당키에 값이 존재하면 그 값에 +1, 없을 경우 디폴드값인 0에 +1을 진행하게 된다.

    중복일 경우 값이 2가 되며 아래의 -1을 수행하는 코드를 통해 

    중복값의 최종 value : 1

    없는 값의 최종 value: 1

    이렇게 된다.

     

     

     

    728x90
Designed by Tistory.