fffo
[코테뿌수기] hash 본문
접근
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