본문 바로가기

🌈 CS Requirements/프로그래머스

해시: 완주하지 못한 선수

 

✅ 방법 1 : 해시를 이용하지 않고 작성 

1) Arrays.sort() 를 이용하여 participant, completion 정렬 

2) for loop 의 범위는 completion.length - prevent IndexOutOfBound

3) 정렬 했을때 participant 리스트에 완주하지 못한 사람이 마지막에 위치 한다면 온다면 loop 끝난 이후 return participant[i]

                        중간에 온다면 completion[i] == pariticpant[i+1] 이므로, return participant[i]

                       

0 1 2 3 4
filipa josipa marina nikola vinko
filipa josipa nikola vinko  

 

import java.util.*;

class Solution {
    public String solution(String[] participant, String[] completion) {
        int i; //position
        
        Arrays.sort(participant);
        Arrays.sort(completion);
        
        for(i = 0; i < completion.length; i++) {
            if(!participant[i].equals(completion[i])) {
                return participant[i];
            }
        }
        return participant[i];
    }
}

 

✅ 방법 2 : 해시 이용하여 작성

* 참가자 중에 동명이인이 있을 수 있다는 제한사항이 있기때문에 HashMap 이용  

* 알고리즘 : 

   (partition 에서 나온 이름의 수 - completion 에서 나온 이름의 수) 

    == 0 일 경우는 참가자가 완주했다는 의미이고

    == 1 일 경우는 참가자가 완주하지 못했다는 의미가 된다. 

import java.util.*; // HashMap 이용
import java.util.Map.*; // Entry<> 이용

class Solution {
    public String solution(String[] participant, String[] completion) {
        HashMap<String, Integer> map = new HashMap<>();
        
        for(String part : participant) {
            map.put(part, map.getOrDefault(part, 0) + 1);
            // getOrDefault(Object key, V defaultValue)
            // 찾는 키가 존재한다면 찾는 키의 값을 반환하고 없다면 기본 값 0을 반환
            // 현재 저장된 문자열 수 + 1
        }
        
        // participant 에서 넣었던 이름들을 completion에서 찾아 동일한 이름이 존재한다면
        // count 를 줄여라. 그러면 두 Array에 존재했던 이름들은 0 이 되고
        // participant 에만 존재했던 이름은 1로 남게된다.
        for(String comp : completion) {
            map.put(comp, map.get(comp) - 1);
        }
        
        // map을 iterate하며 map 안의 
        // value(participant 나타난 이름 수 - completion 나타난 이름수) 가
        // 0 보다 클 경우 값을 return 한다. 
        for(Entry<String, Integer> entry : map.entrySet()) {
            if(entry.getValue() > 0) {
                return entry.getKey();
            }
        }
        return "";
    }
}

🌟 Hash 에서 중요한 메소드 

containsKey(Object key) map 에 존재하면 return true 
get(Object key) key가 매핑되어있는 value return
getOrDefault(Object Key, V defaultValue) map에 존재하면 key의 값을 없게되면 default 값을 return
entrySet() -- Set<Map.Entry<K,V>> map 의 Set 리턴
size() Map 의 크기 return
put(K key, V value) map 안에 key-value 저장

 

 

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

 

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

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

programmers.co.kr

 

 

'🌈 CS Requirements > 프로그래머스' 카테고리의 다른 글

정렬: K번째 수  (0) 2021.06.02