일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 제로베이스
- NPM
- leetcode
- 프로그래머스
- CSS
- JavaScript
- 프론트엔드
- Next.js13
- 자바스크립트 문제풀이
- JS
- til
- 자바스크립트 문제
- 타입스크립트
- 알고리즘문제풀이
- 자바스크립트 알고리즘
- 자바스크립트 문제 풀이
- 자바스크립트 연결리스트
- 자바스크립트 알고리즘 문제
- stack문제
- HTML
- Baekjoon
- react
- Next
- 자바스크립트
- leetcode문제풀이
- lodash
- 자바스크립트코딩테스트
- 리액트쿼리
- next13
- 리액트
- Today
- Total
코드노트
프로그래머스 완주하지 못한 선수 풀이 정리 본문
문제 설명
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 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" |
처음 문제를 보고 fileter를 쓰려고 했다.
filter를 사용하게 되면 첫번째, 두번째는 return 값이 잘 나오게 되지만
3번째 return 값에서는 "mislav" 가 출력되지 않는다....
false 풀이
return participant
.concat(completion)
.filter((i) => !participant.includes(i) || !completion.includes(i))
.join("");
- concat으로 배열을 합친다.
- filter를 통해서 배열에 포함하지 않은 값을 비교하면서 출력한다.
- join으로 문자열로 출력한다.
* 중복한 값을 모두 지우기 때문에 이번 완주하지 못한 선수 문제해서는 사용할 수 없었다.
return participant.filter((i) => !completion.includes(i)).join("");
- concat을 사용하지 않고 participant배열에서 filter를 통해 completion에서 포함하지 않는 값을 출력한다.
* 이 또한 중복값을 모두 지우기 때문에 마지막 입출력에서 오류가 나왔다.
true 풀이
participant.sort();
completion.sort();
for (let i = 0; i < participant.length; i++) {
if (participant[i] != completion[i]) {
answer = participant[i];
break;
}
}
- sort를 통해서 모두 정렬을 시켜주었다.
- for를 돌면서 각 배열의 문자가 맞지 않은 것들을 출력한다.
* 정렬을 통해서 중복 된 값을 제외하고 중복하지 않은 값만 출력해서 문제를 해결할 수 있었다.
다른 풀이
var solution=(_,$)=>_.find(_=>!$[_]--,$.map(_=>$[_]=($[_]|0)+1))
- .....??? 이건 뭔가 했다.. 우선 설명을 해보자면.....
- 완주자 배열을 배열에 등장하는 횟수로 맵핑을 한다.
- 그 후 그맵에 참가자 이름을 하나씩 넣으면서 찾아볼때마다 횟수를 떨어트리고 횟수 0이 나오는 아이를 출력하는 함수인거 같다...
- 아몰랑;
for, map, set을 사용한 풀이
function solution(participant, completion) {
const map = new Map();
for(let i = 0; i < participant.length; i++) {
let a = participant[i],
b = completion[i];
map.set(a, (map.get(a) || 0) + 1);
map.set(b, (map.get(b) || 0) - 1);
}
for(let [k, v] of map) {
if(v > 0) return k;
}
return 'nothing';
}
- 가장 가독성이 좋았던 코드인거 같다. map을 사용하려는 생각은 했지만 코드가 길어질까봐 사용하지 않았었는데.. 배열의 길이가 길어지면 sort보다 성능이 좋은 코드라고 한다. 코드의 길이보다 성능이 좋으면 좋은코드지...!
- map.set 메소드로 map에 새로운 객체를 추가한다.변수로 a, b를 통해서 for가 돈다.
- a를 넣으면서 +1이 되고 b를 넣으면서 같은 값이 있으면 -1을 한다. 만약 같은 값이 없으면 0이상 1인값들이 생긴다.
- 마지막 for of를 통해서 0이상 1인 값들을 출력한다( 미완주자, 동명이인)
sort, pop, while 사용한 풀이
const solution = (p, c) => {
p.sort()
c.sort()
while (p.length) {
let pp = p.pop()
if (pp !== c.pop()) return pp
}
}
- sort로 순서를 정렬한다.
- while을 도는데 pop을 통해서 배열을 빼가면서 배열이 0이 될때까지 while을 실행한다.
- 그렇게 되면 중복하지 않은 값들만 남게 된다.
- 남은 값들을 출력한다.
retuce, find 를 사용한 풀이 // 가장 해시에 알맞은 답이라고 생각한다.
function solution(participant, completion) {
var dic = completion.reduce((obj, t)=> (obj[t]= obj[t] ? obj[t]+1 : 1 , obj) ,{});
return participant.find(t=> {
if(dic[t])
dic[t] = dic[t]-1;
else
return true;
});
}
- reduce를 통해서 객체에 +1을 더하며 넣는다. //{ stanko: 1, ana: 1, mislav: 1 }
- find를 통해서 값을 비교하며 -1을 하여 담아주고 만약 0이 아닌 값이 생기면 true이므로 반환시킨다.
'Code note > 자바스크립트 알고리즘 문제풀이' 카테고리의 다른 글
k번째 수, 프로그래머스 자바스크립트 문제 풀이 (0) | 2022.09.02 |
---|---|
프로그래머스 로또의 최고 순위와 최저순위 풀이 정리 (0) | 2022.09.02 |
코딩테스트 연습 - 올바른 괄호 (0) | 2022.08.30 |
코딩테스트 연습 - 같은숫자는 싫어 (0) | 2022.08.30 |
자바스크립트 달팽이 배열 문제 풀이 (0) | 2022.08.26 |