ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [매일코딩-프로그래머스] 완주하지 못한 선수 01
    WEB Dev/CordingTEST 2021. 12. 27. 11:07
    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

    댓글

Designed by Tistory.