fffo

[코테뿌수기] hash 본문

Programming/Algorithm

[코테뿌수기] hash

gggs 2022. 2. 6. 23:59

접근

hash map

  • 해시맵 만들 때 value에 또 다른 해시맵이 들어갈 때 빈 객체 초기화 과정이 필요
  • 순회할 때는 표준 빌트인 객체인 Object 객체의 정적 메서드 keys, values, entries를 적절히 활용

연습

[Lv. 1] 완주하지 못한 선수

 

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

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

programmers.co.kr

function solution(participant, completion) {
    const completeCountList = participant.reduce((list, name) => {
        list[name] = list[name] ? list[name] + 1 : 1;
        return (list);
    }, {});
    completion.forEach(name => completeCountList[name]--);
    return (Object.keys(completeCountList).find((key) => completeCountList[key] > 0));
}

[Lv. 2] 전화번호 목록

⚠ 해당 문제는 프로그래머스에서 js를 지원하지 않아 자바로 풀이함

 

코딩테스트 연습 - 전화번호 목록

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다. 구조

programmers.co.kr

import java.util.HashMap;

class Solution {
    public boolean solution(String[] phone_book) {
        HashMap<String, Boolean> prefix_map = new HashMap<>();
        for (int i = 0; i < phone_book.length; i++) {
            prefix_map.put(phone_book[i], true);
        }
        for (int i = 0; i < phone_book.length; i++) {
            String temp_num = "";
            for (int j = 0; j < phone_book[i].length() - 1; j++) {
                temp_num += phone_book[i].charAt(j);
                if (prefix_map.containsKey(temp_num))
                    return (false);
            }
        }
        return (true);
    }
}

[Lv. 2] 위장

 

코딩테스트 연습 - 위장

 

programmers.co.kr

function solution(clothes) {
    const clothesDict = {};
    clothes.forEach(clothe => {
        if (clothesDict[clothe[1]])
            clothesDict[clothe[1]] += 1;
        else 
            clothesDict[clothe[1]] = 1;
    });
    return (Object.values(clothesDict).reduce((count, curCount) => {
        return (count * (curCount + 1));
        }, 1) - 1)
}

[Lv. 3] 베스트앨범

 

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

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

programmers.co.kr

function solution(genres, plays) {
  const genreScore = {};
  genres.forEach((g, i) => {
    genreScore[g] = genreScore[g] ? genreScore[g] + plays[i] : plays[i];
  });
  const genreCount = {};
  return genres.map((g, i) => {
    return { genre: g, score: plays[i], index: i};
  }).sort((a, b) => {
    if (genreScore[a.genre] !== genreScore[b.genre])
      return genreScore[b.genre] - genreScore[a.genre]
    if (a.score !== b.score)
      return b.score - a.score;
    return a.index - b.index;
  }).filter(e => {
    if (genreCount[e.genre] >= 2) return false;
    genreCount[e.genre] = genreCount[e.genre] ? genreCount[e.genre] + 1 : 1;
    return true;
  }).map(e => e.index);
}

아래는 코드 가독성을 높이고자 해시 맵의 값에 다시 객체를 넣어 구조체처럼 다루려고 시도한 코드. 생각보다 가독성이 떨어지는 것 같다.

function solution(genres, plays) {
    const bestAlbum = genres.reduce((result, genre, id) => {
        if (result[genre]) {
            result[genre]["sum"] += plays[id];
            if (result[genre]["first"]["play"] < plays[id]) {
                result[genre]["second"]["id"] = result[genre]["first"]["id"];
                result[genre]["second"]["play"] = result[genre]["first"]["play"];
                result[genre]["first"]["id"] = id;
                result[genre]["first"]["play"] = plays[id];
            }
            else if (result[genre]["second"]["play"] < plays[id]) {
                result[genre]["second"]["id"] = id;
                result[genre]["second"]["play"] = plays[id];
            }
        }
        else {
            result[genre] = {};
            result[genre]["sum"] = plays[id];
            result[genre]["first"] = {};
            result[genre]["first"]["id"] = id;
            result[genre]["first"]["play"] = plays[id];
            result[genre]["second"] = {};
            result[genre]["second"]["id"] = null;
            result[genre]["second"]["play"] = 0;
        }
        return (result);
    }, {});
    return (Object.values(bestAlbum)
        .sort((a, b) => b["sum"] - a["sum"])
        .reduce((result, {first, second}) => {
            result.push(first["id"]);
            if (second["id"] !== null) 
                result.push(second["id"]);
            return (result);
        },[]));
}

'Programming > Algorithm' 카테고리의 다른 글

[코테뿌수기] 스텍/큐  (0) 2022.02.08
[코테뿌수기] 정렬  (0) 2022.02.07
[js문제풀이] 경주로 건설  (0) 2021.11.05
[js문제풀이] 표 편집  (0) 2021.11.04
[js문제풀이] 광고 삽입  (0) 2021.11.01
Comments