티스토리 뷰

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

 

해시맵을 이용한 풀이 1

//1. 다른 사람의 풀이
public String solution_2_1(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;
            break;
        }
    }

1. for문을 돌려 참가자를 해시맵에 넣는다.

2. 이 때 getOrDefault를 이용해 맵에 값이 존재하지 않으면 1을 넣고(0+1), 존재하면 존재하던 값에 + 1 해준다.(즉, 같은 이름이 2개라면 처음에 1, 그 다음에 1+1로 2가 된다.

3. for문을 이용해 완주자의 값도 넣는다. 이 때 맵 이름을 돌려가며 찾아 -1 해준다.(두 명이면 -2가 될 것)

4. keySet()은 키 값만 필요한 경우이다. 즉, hm.keySet()으로 포문 돌리면 hm의 key 값만 돌려줌

5. 받은 키 값으로 value를 조회해 0이 아니면 완주하지 못한 사람이므로 반환한다.

 

해시맵을 이용한 풀이 2

//2. 다른 사람의 풀이
public String solution_2_2(String[] participant, String[] completion){
    String answer = "";
    HashMap<String, Integer> hm = new HashMap<>();

    for(int i=0; i < participant.length; i++){
        hm.compute(participant[i], (k,v) -> v != null ? null : 1);
        if(i < completion.length){
            hm.compute(completion[i], (k,v) -> v != null ? null : 1);
        }

    }
    return hm.keySet().iterator().next();
}

1. 어차피 완주자는 참가자보다 한 명 적은 수일 것이다.

2. 참가자 포문을 돌리면서 i가 완주자보다 작기만 하면 완주자는 인덱스 범위를 넘을 일이 없다.

3. compute는 getOrDefault와 비슷하다. 키 값에 따라 value 연산을 정의한다.

4. 참가자 포문을 돌리고 참가자 키 값과 value 값을 넣는다. 이 때 벨류가 존재하면 null, 아니면 1로 정의한다.

5. 완주자도 마찬가지로 키 값에 따라 벨류가 존재하면 null, 아니면 1로 정의한다.

6. 마지막에 맵에 데이터 있는거 반환

 

예시)

참가자 leo, kiki, eden

완주자 eden, kiki

인덱스 0일 때, 참가자 leo는 맵에 존재하지 않으니 1 / 완주자 eden도 맵에 존재하지 않으니 1

인덱스 1일 때, 참가자 kiki 맵에 존재하지 않으니 1 / 완주자 kiki 맵에 존재하니 null

인덱스 2일 때, 참가자 eden 맵에 존재하니 null / 완주자는 끝남

keySet()으로 키 값 구해서 iterator로 돌려서 키 값으로 벨류 구하고 next()로 존재하는 거 반환한다.

 

내가 생각했을 때 첫 번째도 충분히 포문 한 번으로 돌릴 수 있을 거 같다.

 

틀린 것이 있다면 댓글로 남겨주세용ㅠㅠ

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함