안녕하세요
프로그래머스 JS [롤케이크 자르기] 본문
롤케이크 자르기
입출력 예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));
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]);
'프로그래머스 > Lv.2' 카테고리의 다른 글
프로그래머스 JS [하노이의 탑] (0) | 2023.01.14 |
---|---|
프로그래머스 JS [전력망을 둘로 나누기] for of (0) | 2023.01.11 |
프로그래머스 JS [거리두기 확인하기] (0) | 2023.01.08 |
프로그래머스 JS [멀쩡한 사각형] (0) | 2023.01.07 |
프로그래머스 JS [가장 큰 정사각형 찾기] (0) | 2023.01.02 |