본문 바로가기
알고리즘 스터디/프로그래머스 코딩테스트

[프로그래머스 코딩테스트 고득점 Kit - 해시] 완주하지 못한 선수 문제 풀이 및 설명 - 자바스크립트[JavaScript]

by 레일라오리덕 2021. 4. 12.
728x90

programmers.co.kr/learn/courses/30/lessons/42576?language=javascript

 

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

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

programmers.co.kr

문제

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

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

 

제한 사항

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

 

결괏값 예시

 

sparticipant 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"

 

기본 제공 틀

 

function solution(participant, completion) {
    var answer = '';
    return answer;
}

 

풀이 [JavaScript]

 

처음으로 이 문제를 풀었을 땐, 정확성 테스트 결과는 100점이었지만, 효율성 테스트는 0점으로 나왔다.

아래는 처음에 내가 풀었던 해결방법이다.

 

function solution(participant, completion) {
    var answer = '';
    for(var i in completion){
        var key =  completion[i];
        var value = participant.indexOf(key);
        if(value!=-1){
            participant.splice(value, 1);
        }
        answer = participant[0];
    }
    return answer;
}

내가 생각했던 방법은 completion배열을 돌면서 해당 배열의 값이 participant에 있으면 해당 값을 participant에서 splice를 이용해서 삭제하는 방법을 생각했었다.

 

indexOf() : 호출한 String 객체에서 주어진 값과 일치하는 첫번쨰 인덱스를 반환하며, 일치하는 값이 없을 시 -1을 반환.

이 과정에서 String.indexOf(searchKeyword)/ Array.indexOf(searchKeyword)라는 배열검색 메서드를 사용했다. 

해당 메서드에서는 해당 String에서 searchKeyword를 파라미터로 입력했을때 해당 단어가 특정 String이나 Array에 존재하는지 확인해준다. 

-1이라는 결과값이 나왔을때는 특정 문자열이 포함되어있지 않다는 의미이다.

 

splice() : 배열의 기존 요소를 삭제 또는 교체하거나 새 요소를 추가하여 배열의 내용을 변경할 때 사용. 

string.splice(index, num) 메서드를 사용하여 해당 key값이 들어있는 participant의 index를 1개(num) 삭제하는 방식으로 사용했다.

 

효율성이 0점이라는 결과가 나와 적잖이 당황(?)하고 충격(?)을 받았지만 곧 해시 관련 문제라는 점을 착안하여 구글링을 해보았다.

해시는 해시테이블이라는 자료구조에 사용되며, 매우 빠른 데이터 검색을 위해 널리 사용된다고 한다.

하지만 여기서 key, value값을 어떻게 지정해여 맵을 생성해야하는지에 대한 의문이 가득했다.

문득, participant와 completion의 length가 1인점과 key, value지정을 생각하다보니 알파벳순으로 정렬해서 비교를 해볼까? 하는 생각이 들었다.

sort한 결과값

var participant = ["ana", "mislav", "mislav", "stanko"];
completion =["ana", "mislav", "stanko"];
예상 결과값 : "mislav"

var participant =["eden", "kiki", "leo"];
completion = ["eden", "kiki"];
예상 결과값 : "leo"

var participant =["filipa", "josipa", "marina", "nikola", "vinko"];
var completion = ["filipa", "josipa", "marina", "nikola"];
예상 결과값 : "vinko"

이렇게 정렬을 해놓고 보니 participant를 key, completion을 value로 대입하듯이 생각해보면, 결국 key와 value값이 일치하지 않을때 해당 값의 key값 즉, participant를 answer로 도출해내면 되겠다는 생각이 들었다.

 

그래서 결국 아래와 같은 코드를 짜게 되었다. 

728x90
function solution(participant, completion) {
    var answer = '';
    participant = participant.sort();
    completion = completion.sort();
    for(var i in participant){
       if(participant[i]!=completion[i]){
           answer = participant[i];
           return answer;
       }
    }
}

 

이후 사수의 도움을 받아 더 깔끔하게 코드를 정리해보았다.

 

function solution(participant, completion) {
    participant = participant.sort();
    completion = completion.sort();
    for(var i in participant){
       if(participant[i]!==completion[i]){
           return participant[i];
       }
    }
}

사수의 조언: 기본틀에 answer가 있었다 하더라도 answer라는 틀에 박혀있지말고 더 짧고 효율적으로 코드를 짜도록 해보아라.

난 기본 예제에 var answer = ''; 가 있었기에 그 틀에 맞추려 answer 변수를 선언하고 결국 return 도 answer로 했었다.

이 틀에 너무 박히지 않아야겠다는 생각이 든게 다른 사람들의 풀이를 봐도 다들 participant를 타이핑하는데 효율적이지 않아 p라는 파라미터로 변경해놓은 것을 확인했다.

최소한의 시간으로 최대한 효율적으로 코드를 짤 수 있게 노력해봐야겠다.

 

채점 결과 [JavaScript]

 

완주하지 못한선수 채점결과

 

[참고한 출처]

developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/splice

 

Array.prototype.splice() - JavaScript | MDN

Array.prototype.splice() splice() 메서드는 배열의 기존 요소를 삭제 또는 교체하거나 새 요소를 추가하여 배열의 내용을 변경합니다. The source for this interactive example is stored in a GitHub repository. If you'd like

developer.mozilla.org

developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf

 

String.prototype.indexOf() - JavaScript | MDN

String.prototype.indexOf() indexOf() 메서드는 호출한 String 객체에서 주어진 값과 일치하는 첫 번째 인덱스를 반환합니다. 일치하는 값이 없으면 -1을 반환합니다.  The source for this interactive example is stor

developer.mozilla.org

 

728x90

댓글