[프로그래머스 코딩테스트] 해시 - 완주하지 못한 선수

 Java Script 

[프로그래머스 코딩테스트] 해시 - 완주하지 못한 선수

 

👉 하루에 한번씩 코딩 실력을 기르기 위해 시작하는 프로그래머스 코딩테스트

👉 코딩테스트 연습 > 해시 > 완주하지 못한 선수

 

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

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

programmers.co.kr

 

문제 설명 및 제한사항

👉 문제

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

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

👉 제한사항

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

 

정답 및 풀이

👉 정답

function solution(participant, completion) {
    var answer = '';
    let hash = []
    if(
      participant.length > 0 && participant.length <= 100000
      && participant.length-1 == completion.length
      ) {
        participant.forEach(name => {
            hash[name] = hash[name] ? hash[name] + 1 : 1;
        })

        completion.forEach(name => {
            hash[name] = hash[name] - 1;
        })

        for (var key in hash) {
            if (hash[key] >= 1) answer = key;
        }
        return answer;
    }
}

👉 풀이

  1. 배열에 중복검사를 통해 답을 찾아내도 되지만 [해시] 문제이기 때문에 해시 접근을 통해서 풀어봅니다.
  2. 제한사항중 처리 할 수 있는 부분은 if문으로 선처리 해줍니다.
  3. participant 배열에는 마라톤 참여 선수들의 이름이, completion 배열에는 완주 선수들의 이름이 들어있습니다.
  4. participant 배열의 값을 hash 배열의 key로 만든 후, hash배열의 key 값이 0(false)면 1을, 아니면 1+1을 시켜줍니다.
    1.  hash배열의 key에 대한 값이 0이 아닌 경우는 동명이인이 있을 경우이기 때문에 동명이인 분기를 위한 1+1처리입니다.
  5. completion 배열의 값을 hash 배열의 key로 대입하여 hash 배열의 key값을 -1 해줍니다.
  6. 결과적으로 hash배열의 key값이 0이 된 사람은 completion 배열의 값(완주 한 사람)이 됩니다.

 

마무리

👉 해시란?

해시 함수, 해시 알고리즘, 해시코드 등 여러가지로 표현 될 수 있지만, 프로그래머스에서 표현한 해시는 본인의 뇌피셜로 데이터를 관리하는 기법중 하나를 뜻하며 검색(search), 삽입(insert), 삭제(delete) 등을 단시간에 할 수 있게 만들어주는 기법을 의미하는게 아닐까 싶다.

 

👉 javascript foreach(es6) 문법

 

Array.prototype.forEach() - JavaScript | MDN

forEach() 메서드는 주어진 함수를 배열 요소 각각에 대해 실행합니다.

developer.mozilla.org