수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
제한사항
입출력 예
| participant | 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" |
[출처] 프로그래머스(https://programmers.co.kr/learn/courses/30/lessons/42576)
function solution(participant, completion) { for (let i=0; i <= participant.length - 1; i++) { // 참가자배열중 1번~마지막까지 반복 for (let j=0; j <= completion.length - 1; j++) {// 참가자 n과 완주자 배열에서 비교 if(participant[i] === completion[j]) { participant[i] = 0 completion[j] = 0 // 동일할 경우 참가자배열과 완주자 배열 0으로 변경 } } } for (let k=0; k <= participant.length - 1; k++) { if (participant[k] !== 0) { return participant[k]// 출력 참가자 배열중 0이아닌 값 출력반복 } } }
문제를 풀기 전 배열에 대한 이해가 낮기 때문에 따로 공부를 하고 코딩테스트를 진행할 수 있었다. 처음 문제를 읽었을 때는 이중반복문을 사용해서 각 배열을 비교한 후 참가자 배열에서 겹치치 않는 값을 찾아내어 출력하면 될 것이라 생각해서 위와 같은 형태로 코드를 작성했고 동명이인이 있을 수 있고 배열 순서가 랜덤이기 때문에 완주했을 경우에는 참가자와 완주자(동명이인때문에 발생할 오류를 방지하기 위해) 배열 모두 0을 재할당하기로 하였다.
테스트 코드를 실행했을 때는 정확한 값이 출력되었지만 효율성 테스트는 합격하지 못했다.
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()라는 method를 찾을 수 있었고 반복문을 통해 비교를 하기 전에 두 배열의 순서를 동일하게 재정렬 시킨 후 비교하여 같지 않을 경우 바로 출력될 수 있도록 작성하였다. 위와 같은 경우에는 동명이인이 있더라도 문제가 되지 않는다.
위 답으로 정확성과 효율성 테스트 모두 통과할 수 있었다.