안녕하세요

프로그래머스 JS [롤케이크 자르기] 본문

프로그래머스/Lv.2

프로그래머스 JS [롤케이크 자르기]

sakuraop 2023. 1. 8. 18:02

롤케이크 자르기

입출력 예toppingresult
[1, 2, 1, 3, 1, 4, 1, 2] 2
[1, 2, 3, 1, 4] 0

문제 요약

2등분 했을 때 토핑 종류가 같도록 나눌 수 있는 경우의 수는?

ex) a = [1,2,1], b = [1,3]

=> a는 1,2 두 종류, b는 1,3 두 종류이므로 의도대로 나뉜 것이다.

 

 

코드 풀이

1. map을 이용해 토핑의 종류별 갯수를 저장합니다.

  const bMap = new Map();
  topping.forEach((number) => bMap.set(number, bMap.get(number) ? bMap.get(number) + 1 : 1));

=> Map(4) { 1 => 4, 2 => 2, 3 => 1, 4 => 1 }

 

 

2.  topping의 왼쪽 원소부터 하나씩 bMap에서 aMap으로 이동시키기

  topping.forEach((number) => {
    aMap.set(number, aMap.get(number) ? aMap.get(number) + 1 : 1);
    bMap.set(number, bMap.get(number) - 1);

=> a ( 1=>1 ) , b ( 1=>2, 2=>3, 3=>1 )

 

 

3.  bMap에 토핑 갯수가 0이 되면 해당 토핑 종류 삭제하기
 
    if (bMap.get(number) === 0) {
      bMap.delete(number);
    }
 
=> b ( 1=>0 ) 이라면 1 삭제

 

 

 4. aMap과 bMap의 토핑 종류가 같다면 count +1
    if (aMap.size === bMap.size) {
      count++;
    }

=> a (1=>1, 2=>1) b (1=>2, 3=>1) 

a가 2종류, b가 2종류

count +1


function solution(topping) {
  let count = 0;

  const aMap = new Map();
  const bMap = new Map();

 
  topping.forEach((number) => bMap.set(number, bMap.get(number) ? bMap.get(number) + 1 : 1));

  // topping의 왼쪽 원소부터 하나씩 bMap에서 aMap으로 이동시키기
  topping.forEach((number) => {
    aMap.set(number, aMap.get(number) ? aMap.get(number) + 1 : 1);
    bMap.set(number, bMap.get(number) - 1);

    // bMap에 토핑 갯수가 0이 되면 해당 토핑 종류 삭제하기
    if (bMap.get(number) === 0) {
      bMap.delete(number);
    }

    // aMap과 bMap의 토핑 종류가 같다면 count +1
    if (aMap.size === bMap.size) {
      count++;
    }
  });

  return count;
}

solution([1, 2, 1, 3, 1, 4, 1, 2]);