본문 바로가기

Coding Test/Programmers

[JAVA] 해시 Lv.1 / 완주하지 못한 선수

[문제]


제한 사항

  • 1<= 경기에 참여한 선수의 수 <=100,000
  • completion의 길이는 participant의 길이보다 1 작음
  • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자
  • 동명이인 있을수 있음

[알고리즘]

participant 배열과 completion 배열의 관계를 잘 생각하면 쉽게 답이 나오는 문제입니다.

participant 배열에는 모든 참가자의 이름이, completion 배열에는 완주한 참가자의 이름이 들어가 있는데,
제한 사항 중 "completion의 길이는 participant의 길이보다 1 작음 "을 떠올리면 "완주하지 못한 선수는 항상 1명"입니다.

따라서, participant과 completion 두 배열 모두 정렬한뒤 일치하지 않는 인덱스의 선수 이름을 리턴해주면 되는 문제.

정렬은 sort() 메소드를 사용해주면 됩니다.
ex) Arrays.sort(arr) = 오름차순  / Arrays.sort(arr,Collections.reverseOrder()) = 내림차순
굳이 해시를 쓰지 않아도 되는 문제입니다.



[코드]

sort 사용한 코드

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

 

 

아래는 다른 사람의 풀이인데 HashMap을 사용하여 풀이하였습니다 , 몰랐던 메소드를 사용해서 이 코드도 작성합니다.

HashMap 사용한 코드

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

해시맵 "hm"을 생성하여  participant의 참가자를 key 값으로 , value는 +1 을 넣어줍니다.
그리고 이 HashMap의 key 값에 completion의 명단이 존재하면 value값에 -1을 해주고,
key값의 value값이 0이 아닌 경우 key 값을 answer로 넣어주어 완주하지 못한 명단을 구할 수 있습니다.

* getOrDefault() = 찾는 키가 존재한다면 찾는 키의 값을 반환하고 없다면 기본 값을 반환하는 메서드