2021. 12. 27. 11:07ㆍWEB Dev/CordingTEST
드뎌 좀 바쁜 일정이 지나서 아침 짬 코테연습 시작!
문제는
배열 participant (이하 p) 에는 있고 배열 completion (이하 c)에서는 없는 그러니까 p - c 의 차집합을 구하면 된다.
그러나 동명이인이 있을 수 있기 때문에 두 번 뺄 수는 없다.
어쨌든 배열에서 값을 찾아서 제외해야 하기 때문에 우선 find 나 filter 메소드를 써본다.
1. find( )
array.find((el, idx [,array])=>{
}[,thisArg]);
find 메소드는
- 배열에서 특정 값을 찾는 콜백함수 필요
- 조건에 맞는 값 중에 첫번째 값을 리턴
- 만족하는 값이 없으면 undefined 리턴
2. filter( )
array.filter((el, idx [,array])=>{
}[,thisArg]);
filter 메소드는
- 배열에서 특정 값을 찾는 콜백함수 필요
- 조건에 맞는 모든 값을 배열로 리턴
- 만족하는 값이 없으면 빈 배열을 리턴
우선 첫번째 값만 리턴해주는 find 메소드가 가장 적합할 것 같다. 동명이인의 경우 뒤에 나오는 사람은 통과를 못하는 것으로 봐야하기 때문이다.
첫번째로 만든 솔루션은 다음과 같다.
function solution(participant, completion) {
var answer = '';
participant.find((el, idx)=>{
if(el!=completion[idx]){
answer+=el
}
})
return answer;
}
이 솔루션은 답이 틀릴 수 밖에 없었다.
가장 큰 문제점은 배열을 '순서대로' 비교하기 때문에 el과 completion[idx] 를 순서대로 비교하면서 모두 조건에 맞지 않아 전부 출력되어 버렸다.
어차피 두 배열 다 알파벳이기 때문에 정렬되는 편이 나은 것 같았다.
sort() 메소드를 쓸 것인데, ( )괄호 안에 아무것도 입력하지 않으면 문자열로 취급하고 유니코드 순으로 출력하기 때문에 sort() 그대로 적용해준다.
function solution(participant, completion) {
var answer = '';
var p = participant.sort();
var c = completion.sort();
p.find((el, idx)=>{
if(el!=c[idx]){
answer+=el
}
})
return answer;
}
이렇게 sorting 한 코드를 적용해주면 1, 2번의 테스트는 통과하나 동명이인이 있는 테스트 3은 통과하지 못한다.
같은 원소가 두 개 있으면 el!=c[idx] 코드로 걸러내주지를 못한다.
내일 생각해볼 문제
1. p 배열에 같은 이름이 있다면 find문을 돌리기 전에 p 배열에 이름 두 개 중 한 개를 ex) "mislav2" 와 같이 표시할까?
2. find 대신 filter를 쓰면 달라질까?
'WEB Dev > CordingTEST' 카테고리의 다른 글
[매일코딩-프로그래머스] 문자열 다루기 기본 01, 02 (0) | 2022.01.04 |
---|---|
[매일코딩-프로그래머스] 완주하지 못한 선수 02 + Hash란? (0) | 2021.12.28 |
[매일코딩-프로그래머스] 모의고사 06 (0) | 2021.12.09 |
[매일코딩-프로그래머스] 모의고사 05 (0) | 2021.12.08 |
[매일코딩-프로그래머스] 모의고사 04 (0) | 2021.11.30 |