-
[매일코딩-프로그래머스] 완주하지 못한 선수 01WEB Dev/CordingTEST 2021. 12. 27. 11:07728x90
드뎌 좀 바쁜 일정이 지나서 아침 짬 코테연습 시작!
문제는
배열 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를 쓰면 달라질까?
728x90'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