Hash [Programmers]

자몽·2021년 7월 25일
1

알고리즘

목록 보기
1/31

알고리즘: Hash

https://programmers.co.kr/learn/courses/30/parts/12077

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

function solution(participant, completion) {
    var answer = '';
    const hashMap=new Map();
    // 해시에 player 추가, 동일 선수면 +1씩 더해진다.
    participant.forEach(player=>{
        if(!hashMap.get(player)){
           hashMap.set(player,1)
        }else{
               hashMap.set(player,hashMap.get(player)+1)
        }
    })
    // 완료한 선수만큼 해시의 value를 빼준다.
    completion.forEach(player=>{
        hashMap.set(player,hashMap.get(player)-1)
    })
    // 결국 value가 1 이상인 것은 완주하지 못한 선수밖에 없게 된다.
    participant.forEach(player=>{
        if(hashMap.get(player)>0){
            answer=player
        }
    })
    
    return answer;
}

전화번호 목록(level.2)

def solution(phone_book):
    answer = True
    phone_book.sort()
    for i in range(len(phone_book)-1):
        if phone_book[i]==phone_book[i+1][0:len(phone_book[i])]:
            answer = False
            return False
    
    return answer

위장(level.2)

function solution(clothes) {
    const hash= new Map();
    let count=1;
    for(var i=0;i<clothes.length;i++){
        hash.get(clothes[i][1]) ? hash.set(clothes[i][1],hash.get(clothes[i][1])+1) : hash.set(clothes[i][1],1)
    }
    let index=1
    for (var[key,value] of hash){
        index=index*(value+1)
    }
    const answer = index-1
    
    return answer;
}

베스트앨범(level.3)

function solution(genres, plays) {
    var answer = [];
    var genresObj={}
    var music=[]
    // 장르 내부 plays수 구하기
    genres.forEach((genre,i)=>{
        genresObj[genre]=genresObj[genre] ? genresObj[genre]+plays[i] : plays[i]
    })
    var genArray = Object.entries(genresObj).sort((a,b)=>
        b[1]-a[1]
    )

    // genres, plays를 담는 music 객체 생성
    for(var i=0;i<genres.length;i++){
        music.push({genre: genres[i],play: plays[i],index: i})
    }
    music.sort((a,b)=>b.play===a.play ? a.index-b.index : b.play-a.play)

    for(var [key,value] of genArray){
        var count=0
        music.map(t=>t.genre===key && count++<2 && answer.push(t.index))
    }
        return answer;
}

다시 풀었을 때, 나온 풀이

function solution(genres, plays) {
    const answer = []
    
    const albums = []
    const sumPlays = {} // 장르 내부 곡의 전체 재생 횟수
    const genreSort = {} // 장르에서 상위 2번째 노래까지 선택하기 위해 만든 객체
    
    // 장르 정보 객체에 저장
    genres.forEach((genre,i)=>{
        sumPlays.hasOwnProperty(genre) ? sumPlays[genre] = plays[i] + sumPlays[genre] : sumPlays[genre] = plays[i]
        genreSort[genre] = 0
    })

    
    // 배열에 노래에 대한 정보를 객체로 추가
    genres.forEach((genre,index)=>{
        albums.push({
            genre: genre,
            plays: plays[index],
            index: index,
            sumPlays: sumPlays[genre]
        })
    })

    // albums 정렬 1. 장르 재생 수 2. 각 노래 재생 수
    albums.sort((a,b)=>b.sumPlays - a.sumPlays).sort((a,b)=>{
        if (a.sumPlays === b.sumPlays) {
            return b.plays - a.plays
        }
    })
    
    // answer에 추가
    albums.map(album=>{
        genreSort[album.genre]++
        if (genreSort[album.genre] <= 2) {
            answer.push(album.index)
        }
    })

    return answer;
}
profile
꾸준하게 공부하기

0개의 댓글