[프로그래머스] Level 1 - 완주하지 못한 선수 (JavaScript)

구미·2021년 6월 30일
2

알고리즘

목록 보기
15/25

처음 작성한 코드

function solution(participant, completion) {
    
    for (let p of completion) {
        let i = participant.indexOf(p);
        participant.splice(i, 1);
    }
    return participant[0];
}

정확성 테스트는 통과했는데 효율성 테스트에서 실패 🥲
이중for문이 아니어서 괜찮을 줄 알았는데 아니었나보다...

sort를 이용한 방식

function solution(participant, completion) {
    const n = participant.length;
    let answer = '';
    
    participant.sort();
    completion.sort();
    
    for (let i = 0; i < n; i++){
        if (participant[i] !== completion[i]) {
            answer = participant[i];
            return answer;
        }
    }
}

sort를 이용해 배열을 정렬한 후 for문을 돌며 완주하지 못한 참가자를 찾는 방법
간단하고 효율적인 듯!

object 를 이용한 방식

풀이 1

function solution(participant, completion) {
    
    const obj = {}
    
    for (let p of participant) {
        obj[p] = obj[p] ? obj[p] + 1 : 1;
    }
    for (let c of completion) {
        obj[c] -= 1;
    }
    for (let key in obj) {
        if (obj[key] == 1) {
            return key;
        }
    }
}
  • participant 배열을 돌면서 참가자 이름을 객체 key로, value로 1을 설정
    ( 🤔❓ 삼항 연산자로 쓰는 이유는 뭘까,,, )
  • completion 배열을 돌면서 완주한 참가자 이름을 key로 찾아 value를 0으로 만들어줌
  • 완주하지 못한 참가자를 찾아 key값을 반환

for... in

for ... in 명령문은 상속된 열거 가능한 속성들을 포함하여 객체에서 문자열로 키가 지정된 모든 열거 가능한 속성에 대해 반복합니다. (Symbol로 키가 지정된 속성은 무시합니다.)

for ... of

for ... of 명령문은 반복가능한 객체 (Array, Map, Set, String, TypedArray, arguments 객체 등을 포함)에 대해서 반복하고 각 개별 속성값에 대해 실행되는 문이 있는 사용자 정의 반복 후크를 호출하는 루프를 생성합니다.

for ... infor ... of 의 차이

  • for ... in 루프는 객체의 모든 열거가능한 속성에 대해 반복

  • for ... of 구문은 컬렉션 전용

  • for ... of 구문은 모든 객체보다는, [Symbol.iterator] 속성이 있는 모든 컬렉션 요소에 대해 이 방식으로 반복

Object.prototype.objCustom = function () {};
Array.prototype.arrCustom = function () {};

let iterable = [3, 5, 7];
iterable.foo = "hello";

for (let i in iterable) {
  console.log(i); // logs 0, 1, 2, "foo", "arrCustom", "objCustom"
}

for (let i of iterable) {
  console.log(i); // logs 3, 5, 7
}

풀이 2

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를 사용
  • reduce의 콜백 함수의 , obj : 가공된 object를 통째로 리턴
  • 리턴된 값은 다음 콜백 함수가 실행될 때 누산기(acc)로 할당됨
  • , {} : 원본 배열에 빈 객체 할당

문제 출처

https://programmers.co.kr/learn/courses/30/lessons/42576?language=javascript

참고

https://miiingo.tistory.com/338
http://yoonbumtae.com/?p=3578

profile
디지털 노마드를 꿈꾸며! 🦄 🌈

1개의 댓글

comment-user-thumbnail
2022년 8월 24일

엇 구미분이신가요??

답글 달기