[매일코딩-프로그래머스] 완주하지 못한 선수 01

2021. 12. 27. 11:07WEB Dev/CordingTEST

728x90

 

 

드뎌 좀 바쁜 일정이 지나서 아침 짬 코테연습 시작!

 

 


 

문제는 

 

배열 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