JavaScript 코딩 연습 / 완주하지 못한 선수
              
          2020. 3. 13. 23:55ㆍToday I solved/Problems
문제 / 웹사이트
완주하지 못한 선수 / 프로그래머스
난이도
Level 1
내용
마라톤 경기에 참여한 선수들의 이름이 포함된 '참가자' 배열과 완주한 선수들의 이름이 포함된 '완주자' 배열이 있습니다. 참가자 중 한 명을 제외한 모든 선수가 완주했다고 가정할 때, 완주하지 못한 선수의 이름을 구하는 함수를 작성하세요.
※ 참가자 중에는 동명이인이 있을 수 있습니다.
예시
| participant | completion | return | 
| [leo, kiki, eden] | [eden, kiki] | leo | 
| [marina, josipa, nikola, vinko, filipa] | [josipa, filipa, marina, nikola] | vinko | 
| [mislav, stanko, mislav, ana] | [stanko, ana, mislav] | mislav | 
모범 답안
function solution(participant, completion) {
    participant.sort();
    completion.sort();
    for(let i = 0; i < participant.length; i++) {
        if(participant[i] !== completion[i]) return participant[i];
    }
}
function solution(participant, completion) {
	// 맨 뒤 {}로 accumulator object 생성 후 completion의 element를 key로, 1을 value로 저장
    // dic 변수에 위의 object를 저장
    var dic = completion.reduce((obj, t)=> (obj[t]= obj[t] ? obj[t]+1 : 1 , obj) ,{});
    
    // participant의 element t로 dic 변수에 해당하는 값을 찾음
    	// t가 completion에도 있다면 if가 실행되어 dic[t] = dic[t] - 1이 실행
        // t가 completion에 없다면 else가 실행되어 true를 반환
        // find 메서드가 true인 element를 찾아내어 반환
    return participant.find(t=> {
        if(dic[t])
            dic[t] = dic[t]-1;
        else 
            return true;
    });
}
var solution=(_,$)=>_.find(_=>!$[_]--,$.map(_=>$[_]=($[_]|0)+1))
const solution = (p, c) => {
    p.sort()
    c.sort()
    while (p.length) {
        let pp = p.pop()
        if (pp !== c.pop()) return pp
    }
}
공부해야 될 부분
- 두번째 모범 답안
- reduce() 메서드 문법
- reduce(callback (accumulator, currentValue [, index [, array]]) [, initialValue]) {}
 - reduce( (accumulator, currentValue [, index [, array]]) => {} [, initialValue])
 
 - find() 메서드
- 주어진 조건/함수를 충족하는 배열 내 첫 번째 요소를 반환하는 메서드
 
 
 - reduce() 메서드 문법
 
개선해야 될 부분
- 알고리즘 효율성 개선
- 시간 복잡도의 크기: O(1) < O(log n) < O(n) < O(n log n) < O(n^2) < O(2^n) < O(n!) < O(n^n)
- 알고리즘의 수행 시간을 big-O 표기법으로 나타낸 것
 - 참고자료: 빅오 표기법 (Big-O Notation), 시간 복잡도, 공간 복잡도
 
 - 반복문을 중첩해서 쓰는 경우 O(n^n) 알고리즘이 되므로 연산 시간이 기하급수적으로 늘어남
- 예) for 문을 이중으로 쓸 경우: O(n^2)
 
 
 - 시간 복잡도의 크기: O(1) < O(log n) < O(n) < O(n log n) < O(n^2) < O(2^n) < O(n!) < O(n^n)
 - JavaScript 배열과 for ... in
- JavaScript의 for ... in 구문은 객체 내 property 속성 중 enumerable: true인 모든 property를 순회하여 검색
 - 최근의 브라우저는 배열에 대해 for ... in 구문을 사용해도 오류가 나지 않으나, 구 IE의 경우 배열 인덱스 외에도 property가 검출되어 undefined 오류가 발생
 - 그러므로 JavaScript 배열에 대해선 for 또는 ES6의 forEach 메서드를 사용하는 것이 나음
 
 
내 답안
function solution(participant, completion) {    
    participant.sort();
    completion.sort();
    
    for (let i = 0; i < participant.length; i++) {
        if (participant[i] != completion[i]) {
            return participant[i];
            break;
        }
    }
}'Today I solved > Problems' 카테고리의 다른 글
| JavaScript 코딩 연습 / K번째 수 (0) | 2020.03.17 | 
|---|---|
| JavaScript 코딩 연습 / 모의고사 (0) | 2020.03.17 | 
| JavaScript 코딩 연습 / Weak Point (0) | 2020.03.12 | 
| JavaScript 코딩 연습 / Moore Neighborhood (0) | 2020.03.11 | 
| JavaScript 코딩 연습 / Median (0) | 2020.03.10 |