프로그래머스 알고리즘 문제풀이 lvl.1 - 완주하지 못한 선수

Jung Hyun Kim·2021년 1월 26일
0
post-thumbnail

1주 1알고리즘 문제 풀기👆

문제

문제 링크

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

(동명이인 조건 때문에 단순한 배열 에서 includes통해서 답을 얻을 수 있는 문제가 아니었다)

입출력 예

participant       	completion	  return
[leo, kiki, eden]	[eden, kiki]	  "leo"

나의 풀이 1 (정확성은 통과했지만 효율성은 통과 못한 코드)

  1. 먼저 완주하지 못한 선수의 이름을 담을 answer 변수를 만든다.
  2. 완주한 선수 만큼의 for문 을 돌면서 indexOf method를 통해 완주한선수의 이름이 있는 participant의 index를 구한 뒤
  3. splice method를 사용해서 해당 인덱스 값을 지워나가게끔 했다.
  4. 그러고 나면 배열에 완주하지 못한 한명만 담길 것이고, 그 배열의 값을 return 하기 위해 participant[0] 으로 가져왔다.
function solution(participant, completion) {
  let answer = "";
  for (let i = 0; i < completion.length; i++) {
    let repetitiveIndex = participant.indexOf(completion[i]);
    participant.splice(repetitiveIndex, 1);
  }
  answer = participant[0];
  return answer;
}

나의 풀이 2 (정확성/효율성 통과한 코드)

  1. participant와 completion을 sort를 통해 알파벳 순서로 정렬한다.
  2. participant 만큼 for 문을 돌려서 같은 index값의 value가 다른 경우 completion array에 없는 사람이라는 뜻으로 해당 index의 participant를 리턴한다.
function solution(participant, completion) {
  const sortedParticipant = participant.sort();
  const sortedCompletion = completion.sort();

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

느낀점

풀이1 대로 하면 동명이인이 있든 아니든 인덱스를 찾아 제거하고 다 제거되 고 남은 값을 리턴하는 방법이어서 깔끔하다고 생각했는데, for 문안에서 splice 나 indexOf 를 같이 사용하는것에 효율성에 떨어져서 통과되지 못한다는걸 알았다..
이중 for문도 써봤지만 결국 splice와 함께 썼을때 효율성에서 패스하지 못했고, 결국 스터디원의 힌트를 받아 풀이2 코드를 작성할 수 있었다ㅜㅜ 계속푸는것 만이 답이다....

profile
코린이 프론트엔드 개발자💻💛🤙🏼

0개의 댓글