| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- leetcode
- 알고리즘문제풀이
- 자바스크립트 문제 풀이
- 자바스크립트 문제풀이
- 리액트쿼리
- 자바스크립트 알고리즘
- 프론트엔드
- til
- next13
- 프로그래머스
- leetcode문제풀이
- 자바스크립트 알고리즘 문제
- 자바스크립트 연결리스트
- 제로베이스
- 자바스크립트 문제
- 자바스크립트코딩테스트
- 리액트
- JS
- Next
- HTML
- Next.js13
- CSS
- Baekjoon
- JavaScript
- react
- 자바스크립트
- lodash
- stack문제
- 타입스크립트
- NPM
- 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 |
| 코딩테스트 연습 - 올바른 괄호 (2) | 2022.08.30 |
| 코딩테스트 연습 - 같은숫자는 싫어 (0) | 2022.08.30 |
| 자바스크립트 달팽이 배열 문제 풀이 (0) | 2022.08.26 |