[Lv2] 롤케이크 자르기

이말감·2022년 12월 8일
0

Programmers

목록 보기
32/32

문제

링크

풀이

아래 코드는 프로그래머스의 질문 목록의 코드를 참고하여 해결하였습니다.
정확한 설명은 링크를 통해 확인하세요.

코드

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을 이용하여 풀 수 있는 문제였다.

우선 Map을 아주아주 간단하게 정리하면 다음과 같다.
(자세한 설명 : 딥다이브 37장 정리)

  1. 생성 : new Map()
  2. 개수 확인 : size()
  3. 요소 추가 : set()
  4. 요소 취득 : get()
  5. 요소 존재 여부 : has()
  6. 요소 삭제 : delete()
  7. 요소 일괄 삭제 : clear()
  8. 요소 순회 : forEach()

코드 풀이

  1. Map 생성
const temp = new Map();

먼저 Map을 생성한다.

  1. Map temp에 정리하기
	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);을 통해 바뀐 값을 다시 넣어준다.

  1. 토핑 분배하기
	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씩 더한다.

profile
전 척척학사지만 말하는 감자에요

0개의 댓글