아래 코드는 프로그래머스의 질문 목록의 코드를 참고하여 해결하였습니다.
정확한 설명은 링크를 통해 확인하세요.
function solution(topping) {
const temp = new Map();
topping.map((el) => {
if (temp.has(el)) {
const tmptopping = temp.get(el);
tmptopping.count++;
temp.set(el, tmptopping);
}
else {
temp.set(el, {count : 1, visited : false})
}
})
let answer = 0;
let [old, young] = [0, temp.size];
for (let i=0; i < topping.length; i++) {
const topval = temp.get(topping[i]);
if (topval.count >= 1) {
topval.count--;
if (topval.count === 0) young--;
}
if (!topval.visited) {
topval.visited = true;
old++;
}
temp.set(topping[i], topval);
if (old === young) answer++;
}
return answer;
}
이 문제는 Map을 이용하여 풀 수 있는 문제였다.
우선 Map을 아주아주 간단하게 정리하면 다음과 같다.
(자세한 설명 : 딥다이브 37장 정리)
- 생성 : new Map()
- 개수 확인 : size()
- 요소 추가 : set()
- 요소 취득 : get()
- 요소 존재 여부 : has()
- 요소 삭제 : delete()
- 요소 일괄 삭제 : clear()
- 요소 순회 : forEach()
const temp = new Map();
먼저 Map을 생성한다.
topping.map((el) => {
if (temp.has(el)) {
const tmptopping = temp.get(el);
tmptopping.count++;
temp.set(el, tmptopping);
}
else {
temp.set(el, {count : 1, visited : false})
}
})
토핑을 종류에 따라 몇 개씩 있는지 temp에 저장한다.
temp.has(el)
을 통해 해당 토핑이 temp에 존재하는지 확인한다.
만약 없다면 temp.set(el, {count : 1, visited : false})
을 통해 해당 토핑을 key로 한 값을 넣는다. 이때 count는 갯수이고, visited는 해당 토핑을 본 적 있는지 확인하는 용도이다.
해당 토핑이 temp에 있을 경우, temp.get(el)
으로 받아와 count를 1 더해주고 temp.set(el, tmptopping);
을 통해 바뀐 값을 다시 넣어준다.
for (let i=0; i < topping.length; i++) {
const topval = temp.get(topping[i]);
if (topval.count >= 1) {
topval.count--;
if (topval.count === 0) young--;
}
if (!topval.visited) {
topval.visited = true;
old++;
}
temp.set(topping[i], topval);
if (old === young) answer++;
}
반복문으로 모든 토핑을 확인한다.
temp.get(topping[i])
으로 현재 토핑을 key 값으로 하는 value를 받아온다.
topval.count >= 1
으로 갯수가 1보다 클 경우 갯수를 1씩 빼준다.
이때 count 값이 0이 될 경우, 동생의 값을 1 빼준다.
!topval.visited
으로 방문을 하지 않은, 처음 본 토핑일 경우 visited 값을 true로 바꿔주고, 형의 값을 1 더한다.
temp.set(topping[i], topval);
으로 변경했던 값을 다시 넣어준다.
위 과정을 통해 형과 동생의 토핑 갯수가 같을 경우 answer 값을 1씩 더한다.