두 개의 배열(base, sample)을 입력받아 sample이 base의 부분집합인지 여부를 리턴해야 합니다.
advanced 케이스를 생각하지 않고 일단 풀었다. 문제의 예시처럼 입력되는 배열의 길이가 짧은 경우에는 정상적으로 값을 반환하지만 실행시간이 초과되어서 테스트를 통과하지 못했다. 내가 작성한 코드는 sample 배열을 순회할때마다 includes()메서드를 통해서 base 배열을 순회하고 있기 때문에 이중 for문처럼 작동한다.
const isSubsetOf = function (base, sample) {
let count = 0;
for(let item of sample) {
if(base.includes(item)) {
count++;
}
}
if(count === sample.length) return true;
return false;
// every() 메서드를 이용한 풀이_배열 안의 모든 요소가 주어진 판별 함수를 통과하는지 여부를 boolean으로 리턴
// return sample.every((item) => base.includes(item));
};
레퍼런스 코드에는 입력된 배열을 각각 정렬한 다음 두 배열을 비교해주는 것 같은데, 잘 이해가 되지 않아서 다른 방법을 찾아봤다. 지금 듣고 있는 유데미 자바스크립트 알고리즘 강의 목차를 뒤지고, 구글을 뒤진 결과, 이 문제를 해시 유형으로 볼 수 있을 것 같았다.
해시 테이블은 (Key, Value)로 데이터를 저장하는 자료구조 중 하나로 빠르게 데이터를 검색할 수 있는 자료구조. 해시 테이블은 각각의 key값에 해시함수를 적용해 배열의 고유한 인덱스를 생성하고 이 인덱스를 활용해서 값을 저장하거나 검색할 수 있다.
아직 해시 자료구조 자체에 대해서는 잘 이해가 되지 않지만, 문제 풀이에는 적용시켜 볼 수 있을 것 같았다. 비교대상인 길이가 긴 배열의 요소를 키로 하여 객체에 담아주고, 비교 주체인 배열의 요소를 키로 갖는 값이 있는지 확인하는 식으로 접근할 수 있다.
const isSubsetOf = function (base, sample) {
let obj = {}
for(let item of base) {
obj[item] = 1; // 임의의 값
}
for(let item of sample){
if(obj[item]=== undefined) {
return false;
}
}
return true
};
Map을 사용해서도 풀 수도 있다.
const isSubsetOf = function (base, sample) {
let map = new Map()
for(let item of base) {
map.set(item, true);
}
for(let item of sample) {
if(map.get(item)===undefined) {
return false;
}
}
return true
};
프로그래머스 알고리즘 문제 중에도 해시를 사용해서 풀 수 있는 문제가 있어서 풀어봤다.
문제 설명
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
제한사항
마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
completion의 길이는 participant의 길이보다 1 작습니다.
참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
참가자 중에는 동명이인이 있을 수 있습니다.
function solution(participant, completion) {
let hashTable = {};
for(let p of participant) {
//이미 해당 키가 존재하는 경우에는 value에 +1
!hashTable[p] ? hashTable[p] = 1: hashTable[p] = hashTable[p] + 1;
}
for(let c of completion) {
//매핑한 객체에 완주선수 이름이 존재하면 value에 -1
hashTable[c] ? hashTable[c] -= 1 : hashTable[c]
}
// 완주한 선수는 0을 value로 가짐, 그렇지 않은 경우는 1이상
for(let p of participant) {
if(hashTable[p]>=1) {
return p
}
}
}
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
https://velog.io/@garudanish/8%EC%9E%A5-%ED%95%B4%EC%8B%9C-%ED%85%8C%EC%9D%B4%EB%B8%94%EB%A1%9C-%EB%A7%A4%EC%9A%B0-%EB%B9%A0%EB%A5%B8-%EB%A3%A9%EC%97%85