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

jaemin·2020년 9월 30일
0

프로그래머스

목록 보기
3/18
post-thumbnail

완주하지 못한 선수

문제 설명

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

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

입출력 예

participantcompletionreturn
["leo", "kiki", "eden"]["eden", "kiki"]"leo"
["marina", "josipa", "nikola", "vinko", "filipa"]["josipa", "filipa", "marina", "nikola"]"vinko"
["mislav", "stanko", "mislav", "ana"]["stanko", "ana", "mislav"]"mislav"

1) 풀이 과정 설계

  1. completion 배열 안에 있는 단어들이 participant 안에 있다면 잘라내는 방법을 사용하자.

1) 풀이 과정

잘라내는 메서드는 slice() 메서드와 splice() 메서드 두 가지를 알고 있는데, slice는 원래 배열을 훼손하므로 splice()를 써야겠다고 생각했다.

function solution(participant, completion) {
  participant.splice()
  return participant;
}

splice 메서드는 네 개의 매개변수가 올 수 있는데, 필수로 가져야 하는 값은 start에 해당하는 값이다.
내가 원하는 것은 completion의 요소값에 일치하는 요소 "1개"를 삭제하는 것이다.
그러니, 시작하는 값은 participant 배열 안에 completion 요소 값과 일치할 때의 인덱스 값에 해당한다. indexOf 메서드를 사용하자.

function solution(participant, completion) {
  participant.splice(participant.indexOf(completion[0],1));
  return participant;
}

completion[0]일 경우 뿐만 아니라 completion의 모든 요소에 대해서 반복해야 하므로 반복문 적용한다.

function solution(participant, completion) {
  for ( let i = 0; i < completion.length; i++ ) {
    participant.splice(participant.indexOf(completion[i],1));
  }
  return participant + '';
}

결과값은 배열이 아니라 문자열이므로 return 값에서 문자열로 암묵적 타입 변환 시켜주었다.

이렇게 작성하니 결과는 맞혔으나 효율성 검사에서 0점을 받았다.
왜 그런가 했더니 indexOf 메서드를 사용하면 시간이 오래 걸린다고 했다. 다른 방법을 생각해보자.

2) 풀이 과정 설계

participant와 completion 배열을 오름차순 순서로 정렬한 후, 두 배열의 요소 값을 비교한다.
참가자 배열(participant)과 완주자 배열(completion)이 일치하지 않는 값이 미완주자 선수들이다. 이 값을 return 하면 된다.

2) 풀이 과정

function solution(participant, completion) {
  participant.sort();
  completion.sort();

  for ( let i = 0; i < participant.length; i++ ) {
    if ( participant[i] !== completion[i] ) return participant[i];
  }
}

sort 함수는 원 배열이 정렬되므로 따로 변수에 저장해주지 않았다.
이 방법을 사용하면 효율성 검사를 통과할 수 있다.

profile
프론트엔드 개발자가 되기 위해 공부 중입니다.

0개의 댓글