본문 바로가기
공부/알고리즘

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

by yeaseul912 2022. 6. 15.
728x90

1.  문제 설명

더보기

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

마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

2. 제한사항

더보기
  • 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
  • completion의 길이는 participant의 길이보다 1 작습니다.
  • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
  • 참가자 중에는 동명이인이 있을 수 있습니다.

3. 입출력예

participant completion return
["leo", "kiki", "eden"] ["eden", "kiki"] "leo"
["marina", "josipa", "nikola", "vinko", "filipa"] ["josipa", "filipa", "marina", "nikola"] "vinko"
["mislav", "stanko", "mislav", "ana"] ["stanko", "ana", "mislav"] "mislav"

4. 풀이(과정 or 최종)

Solution 1.  ( put vs replace )

1. HashMap<String ,Integer> 으로 참가자들의 이름과 숫자(동명이인) 를 넣어준다

2. 완주자들의 이름을 key로 명수(value)를 찾아서 한명씩 빼준다.

      2-1. put으로 값을 뺀 후 다시 넣는다.

      2-2. replace로 값을 변경해준다.   => 차이가 있을까?! 결과는 밑에서

3. 명수가(value)가 1인 player가 낙오자이다.

    3-1. 참여자(participant)의 이름을 Hashmap의 key로 사용하여 value값을 구해준다.

    3-1. EntrySey으로 만들어서 Entry로 Key값과 Value값을 가져온다.   => 차이가 있을까?! 결과는 밑에서

import java.util.*;
class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        HashMap<String, Integer> player = new HashMap<>();
        for(String p : participant){
            player.put(p, player.getOrDefault(p, 0) + 1);
        }
        
        for(String c: completion){
            player.put(c, player.get(c) -1);
            // player.replace(c, player.get(c) -1);
        }
        
        // Set<Map.Entry<String, Integer>> entrySet = player.entrySet();
        // for(Map.Entry<String, Integer> entry : entrySet){
        //     if(entry.getValue() == 1){
        //         answer = entry.getKey();
        //         break;
        //     }
        // }
        
        for(String p: participant){
            if(player.get(p) == 1){
                answer = p;
                break; // break를 걸어줘야 헛메모리를 덜 수 있다.
            }
        }
        return answer;
    }
}

5. 결과 

Solution 1

2번 비교

비슷하다.

3번 비교

EntrySet()이 훨씬 좋아보인다.

 

6. 마치며

재밌는 실험(?) 을 해보았다. 

어떤 사람의 entry set이 좋다는 조언을 보고 사용해봤는데 훨씬 효율성 측면에서 좋아보인다.

앞으로 entryset을 기억하도록 하자..메모..*

[HashMap 특징 다시,]

- 배열과 연결이 결합된 형태.

- key값이 해시화 되어 값을 저장, 조회 한다.

-  Buckets이라는 곳에 key-value형태의 테이블이 생성된다.

- hashing 기법을 사용하기 때문에 많은 양의 데이터가 저장될때 유용, 검색에 최고성능을 보인다.

- 추가/삭제/검색/접근성이 모두 뛰어나다.

- 순서가 유지되지 않는다. (순서유지가 필요하다면 LinkedHashMap을 사용한다.)

반응형

'공부 > 알고리즘' 카테고리의 다른 글

[프로그래머스] 추석 트래픽  (0) 2022.06.19
[프로그래머스] 3진법 뒤집기  (0) 2022.06.16
[프로그래머스] 조이스틱  (0) 2022.06.12
[프로그래머스] K번째수  (0) 2022.06.11
[프로그래머스] 더 맵게  (0) 2022.06.10

댓글