본문 바로가기
Coding Test/프로그래머스

[프로그래머스 자바 JAVA] 완주하지 못한 선수 (level 1)

by 똧이 2022. 3. 18.
반응형

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

 

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

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

programmers.co.kr

 

 

풀이1

import java.util.Arrays;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        /*
            참고
            participant.length = completion.length + 1
        */
        Arrays.sort(participant); // 1. participant 배열을 오름차순으로 정렬
        Arrays.sort(completion); // 2. completion 배열을 오름차순으로 정렬
        // ==> 둘 다 오름차순으로 정렬했으므로 같은 인덱스에서 값이 다른 그 선수가 완주하지 못한 선수이다.

        for(int i = 0; i < completion.length; i++){
            // 3. completion 길이만큼 돌림 -> participant 길이만큼 돌리면 java.lang.ArrayIndexOutOfBoundsException 가 나므로 주의할 것!
            if(!participant[i].equals(completion[i])){ // 4. 같은 인덱스에서 값이 다르다면
                answer = participant[i]; // 그 선수가 완주하지 못한 선수이므로
                break; // 반복을 멈춘다.
            }
        }

        if(answer.isEmpty()){ // 5. 만약 answer이 비었다면 -> 반복을 completion 길이만큼 돌렸기 때문에 participant 배열의 맨 마지막 값이 정답이 된다.
            answer = participant[participant.length - 1]; // 6. index는 0부터 시작하므로 participant.length - 1이 participant 배열의 맨 마지막 값이 된다.
        }

        return answer;
    }
}

 

 

풀이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 player : participant) hm.put(player, hm.getOrDefault(player, 0) + 1);
        	
        	getOrDefault(key, DefaultValue)
            찾는 key가 존재하면 해당 key에 매핑되어 있는 값을 반환하고, 그렇지 않으면 디폴트 값이 반환됩니다.
            
            HashMap -> 동일 키 값을 추가할 경우 Value의 값이 덮어쓰기가 된다.
            ex. hm.put("mislav", 1);
            	hm.put("mislav", 1);
                
                ==> hm.get("mislav");의 예상값 = 2
                	하지만 hm.get("mislav");의 값은 1이 반환된다.
                    
            -------------------------------------------------------------------------
            
            ! hm.put(player, hm.getOrDefault(player, 0) + 1) 처럼 + 1을 한 이유 !
            ==> HashMap이 동일 키 값을 추가할 경우 Value의 값이 덮어쓰기되는 현상이 발생하기 때문에! 
            
            ex. mislav 선수가 처음 나왔을 경우
            처음 나왔으므로 mislav 라는 key의 value는 없으므로 디폴트 값인 0이 반환된다. 여기서 
            키키가 한 번 나왔음을 나타내주기 위해 디폴트 값인 0에서 1을 더해줘서 mislav key의 value는 1이 된다.
            
            ex. mislav 선수가 두 번째 나왔을 경우
            hm.get("mislav")을 할 경우 mislav key의 value는 1이 된다. 하지만 두 번 나왔기 때문에 이 값에서 + 1을 더해
            mislav key의 value는 2가 되고 이 값을 HashMap에 저장한다.
            
            
        =========================================================================================
        for (String player : completion) hm.put(player, hm.get(player) - 1);
            
            completion 배열에 대한 반복문을 돌리면서 해당 선수가 HashMap에 존재한다면 value를 -1 해준 값을 저장한다.
            
            ex. completion 배열에 mislav 선수가 있는 경우
            	HashMap에서 "mislav"선수의 값을 조회한 결과 2가 나왔다. completion 배열에 mislav 선수가 존재하므로
                HashMap에 있는 mislav 키값의 value를 -1하여 그 값(hm.put("mislav", 2-1)을 해시맵에 다시 저장한다.
            
        */

        for (String key : hm.keySet()) { // keySet(): 전체 map의 key값만 출력하는 메소드
            if (hm.get(key) != 0){ // 해당 키의 value를 조회했을 때 0이 아니라면 == completion 배열에 없던 선수
                answer = key; // 답은 그 선수이다.
            }
        }
        return answer;
    }
}

 

728x90

댓글