https://programmers.co.kr/learn/courses/30/lessons/42576?language=javascript
코딩테스트 연습 - 완주하지 못한 선수
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수
programmers.co.kr
function solution(participant, completion) { for (let j = 0; j < completion.length; j++) { if (participant.indexOf(completion[j] !== -1)) { participant.splice(participant.indexOf(completion[j]),1) } } var answer = participant[0]; return answer; }
처음 작성한 코드는 정확성은 통과 했는데 효율성을 통과하지 못했다. 그도 그럴게 배열의 길이가 100,000인데 일일히 하나씩 대조해가면서 확인하니 최악의 경우 연산을 약99억번 (100,000 * 999,999) 해야하니 시간이 오래 걸릴만 하다.
그래서 각 배열의 원소의 출현횟수를 객체로 저장해두고 출현횟수만 기록하여 비교하는 방식으로 코드를 써서 연산횟수를 줄였다. 이 경우 최대 40만번의 연산으로 수행이 가능하다.
function solution(participant, completion) { const participantCount = {}; for (let j = 0; j < participant.length; j++) { (participantCount[participant[j]] !== undefined) ? participantCount[participant[j]] += 1 : participantCount[participant[j]] = 1; } for (let i = 0; i < completion.length; i++) { participantCount[completion[i]] -= 1; } var answer = Object.keys(participantCount).find(element => participantCount[element] === 1); return answer; }
근데 다른사람들 풀이를 보니까 그냥 sort() 시켜서 두 문자열 사이에서 차이가 나오는 부분을 바로 리턴하는게 더 간편할거 같다. 나는 의미 없이 객체를 하나더 만든 꼴이다.
function solution(participant, completion) { participant.sort(); completion.sort(); for(let i in participant) { if(participant[i] !== completion[i]) return participant[i]; } }
'코딩테스트' 카테고리의 다른 글
(JS) 프로그래머스 - K번째수, 같은 숫자는 싫어,P Y 갯수, 하샤드 수 (0) | 2021.05.25 |
---|---|
개발공부 기록 시작 (0) | 2020.11.02 |
댓글