할머니의 콤퓨타 도전기

Javascript로 프로그래머스 해시 문제 풀기 본문

Algorithm/Problem Solving

Javascript로 프로그래머스 해시 문제 풀기

ji.o.n.e 2021. 6. 22. 22:30

javascript로 알고리즘 문제를 풀어보기로했다.

아직 잘 안써봐서 까막눈급이다 .... 

그래서 프로그래머스 코딩테스트 고득점 kit 중 풀어봤던 걸 다시 javascript로 짜보려한다.

오늘은 해시 문제를 풀어보았다.

 

1. 완주하지 못한 선수 (Level 1)

https://programmers.co.kr/learn/courses/30/lessons/42576

 

코딩테스트 연습 - 완주하지 못한 선수

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수

programmers.co.kr

  • 풀이 설명
    • 완주하지 못한 사람은 한명이다.
    • 따라서 participant와 completion을 오름차순으로 정렬한다.
    • 두 배열을 비교하면서 같지 않을 때의 participant 원소가 완주하지 못한 사람이다.
  • 코드 구현
    • javascript에서 정렬은 배열.sort()로 하는구나
function solution(participant, completion) {
    participant.sort();
    completion.sort();
    for(let i=0; i<participant.length; i++){
        if(completion[i] !== participant[i])
            return participant[i];
    }
}

 

 

2. 위장 (Level 2)

https://programmers.co.kr/learn/courses/30/lessons/42578

 

코딩테스트 연습 - 위장

 

programmers.co.kr

  • 풀이 설명
    • 경우의 수 문제다. 
    • 각 의상 종류별 개수 + 1만큼 다 곱해주면 된다.
      •  의상 종류가 상의 : 2벌, 하의 : 3벌이라면 가능한 조합은 (2+1)*(3+1)-1 = 11
        • 1 빼주는 이유는 아무것도 안입은 경우를 제외해야하기 때문이다.
  • 코드 구현
    • c++이였다면 for문을 썼겠지만 여기서는 forEach를 썼다.
    • index나 조건식 등이 필요없어서 좋은 거서 같다. callback 함수로 기능을 수행한다.
    • 하지만 continue나  break로 반복을 제어할 수 없다. 무조건 끝까지 반복
    • obj[e[1]] = (obj[e[1]] || 1) + 1 부분은 다른 분이 푼 코드보고 괜찮아보여서 써보았다.
      • 이렇게 쓰면 if문으로 초기화여부를 확인해줄 필요가 없이 한줄로 가능하다. 
function solution(clothes) {
    let obj = {};
    let answer = 1;
    
    clothes.forEach((e)=>{
        obj[e[1]] = (obj[e[1]] || 1) + 1;  
    })
    
    for(let key in obj)
        answer *= obj[key]
    return answer-1;
}

 

 

3. 베스트앨범 (Level 3)

https://programmers.co.kr/learn/courses/30/lessons/42579

 

코딩테스트 연습 - 베스트앨범

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가

programmers.co.kr

  • 풀이 설명
    • 열심히 정렬하면 된당. 
    • c++로는 푼 적이 있는데 자바스크립트스럽게(?) 어떻게 푸나 해서 아래의 블로그를 참고했다.
 

[Javascript] 프로그래머스 해시:베스트앨범

처음에 세상 어렵게 풀고 20점인가 맞아서 옹잉..? 했는뎅 에궁 다시봐도 이게 몬가 싶당 주석도 안적었당 그래서 다른 분 코드를 보니깐 요런식으로 되어있었당 reduce를 활용해서 다시 풀었당 이

velog.io

function solution(genres, plays) {

    const genresList = genres.reduce((acc, cur, idx) => {
        if(!acc[cur]){
            acc[cur] ={
                total: 0,
                list: [],
            }
        }
        acc[cur].total += plays[idx];
        acc[cur].list.push([idx, plays[idx]]);
        return acc;
    }, {});

    const sortGenresList = Object.values(genresList).sort((a,b) => {
            return b.total - a.total;
        }
    );
    
    const answer = sortGenresList.reduce((acc, genre) => {
        genre.list.sort((a, b) => {
            return b[1] - a[1];    
        });
        
        acc.push(genre.list[0][0]);
        if(genre.list.length > 1)
            acc.push(genre.list[1][0]);
        
        return acc;
    }, []);
    
    return answer;
}
Comments