SIU
article thumbnail

문제 유형 : 해쉬, 정렬

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

접근법

두 배열에서 서로 다른 원소를 찾으면 된다. 

[첫 번째 풀이]는 배열을 정렬해주고 다른 요소를 발견하면 return 시킨다

participant(참가자) 배열과 completion(완주자) 배열 모두 sort()를 이용해서 정렬시키자. 그리고 인덱스 0부터 두 배열을 비교하면 for문 한 번으로 문제를 해결할 수 있다. participant(참가자) 배열과 completion(완주자) 배열을 0번 부터 비교하다보면 participant(참가자) 배열에 비완주자(정답)가 나올 경우 두 배열 비교 연산은 불일치가 나올 것이고 그 때 participant(참가자) 배열의 요소를 출력하면 된다.

 

 

[두 번째 풀이] 해쉬 (or 객체) 를 이용해서 참가자 배열을 먼저 해쉬 세팅을 해주고 완주자를 빼준다

 

 

 

전체 코드

[ 첫 번째 풀이] 배열 정렬

function solution(participant, completion) {
  // 두 배열을 문자열 정렬을 통해 다른 요소가 등장하면 종료시킨다
  // 문자열 배열 방법을 익혀두자
  // 첫 번째 정렬 방법 : sort 함수
  participant.sort();
  completion.sort()
  // 두 번째 정렬 방법 : 오름차순
  //participant.sort((a,b) => a > b ? 1 : -1);
  //completion.sort((a,b) => a > b ? 1 : -1);
  console.log(participant) // [ 'eden', 'kiki', 'leo' ]
  console.log(completion) // [ 'eden', 'kiki' ]
  
  for(let i = 0; i < participant.length; i++){
     if(participant[i] !== completion[i]){
         return participant[i]
     }   
  }
}

 

 

[첫 번째 풀이] 확장성 고려하여 break문

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

 

 

[두 번째 풀이] 객체 버전

function solution(participant, completion) {
    let hashed = {}
    // let hashed =  new Map(); 동일한 결과
    // 참가자
    participant.forEach(entry => {
        hashed[entry] = hashed[entry] ? hashed[entry] + 1 : 1        
    })
    // 완주자
    completion.forEach(entry => {
        hashed[entry] = hashed[entry] - 1
    })

    for (var key in hashed) {
        if (hashed[key] >= 1) return key
    }
}

 

 

[두 번째 풀이] 객체 버전(2) 

function solution(participant, completion) {
    let hash = {}
    // 참가자 더하기
    participant.forEach((i) => {
        // i(key) property가 있을 때, 없을 때
        hash[i] = hash[i] ? ++hash[i] : 1;
        // (주의)  hash[i] = hash[i] ? hash[i]++ : 1; 삼항 연산자에서 ++ 주의하자 (오답)
    })
    //console.log(hash)
    // 완주자 제외 => 남는 거 완주 못한 참가자
    completion.forEach((j) => {
        // comletion 은 participant에 포함되니 사람 이름 property가 없을 수가 없다
        hash[j]-- 
    })
    
    // 2번째 로직에서 값을 없앤거지(0) property(사람 이름은) 계속 남아 있다 
    for(let key in hash){
        if(hash[key] > 0) return key
    }
    
}

 

profile

SIU

@웹 개발자 SIU

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!