(롤케이크 자르기)[https://school.programmers.co.kr/learn/courses/30/lessons/132265]
배운 것, 유의할 것
Set을 활용한 풀이
해당 문제는 형과 동생이 각자 중복된 토핑을 갖고 있다면 하나로 보기 때문에 배열로 풀 경우 중복 값을 삭제해주는 별도의 연산이 필요로 하기 때문에 Set을 사용했다.
평소 잘 활용하지 않던 Set의 메소드들 간단 정리
- add
const set1 = new Set();
set1.add(1);
set1.add(2);
console.log(set1); // Set(2) { 1, 2 }
- clear, size
const set1 = new Set();
set1.add(1);
set1.add('foo');
console.log(set1.size);
// Expected output: 2
set1.clear();
console.log(set1.size);
// Expected output: 0
- delete
const set1 = new Set();
set1.add({ x: 10, y: 20 }).add({ x: 20, y: 30 });
// Delete any point with `x > 10`.
set1.forEach((point) => {
if (point.x > 10) {
set1.delete(point);
}
});
console.log(set1.size);
// Expected output: 1
- has
const set1 = new Set([1, 2, 3, 4, 5]);
console.log(set1.has(1));
// Expected output: true
console.log(set1.has(5));
// Expected output: true
console.log(set1.has(6));
// Expected output: false
forEach의 활용
사실 인덱스를 활용해서 반복문을 푸는 경우에는 그냥 for문을 자주 이용했었는데, forEach((v,i)=>...)
를 활용해서 forEach문으로 문제를 풀었다. 이번 사례를 잊지말고, 다양한 메소드를 좀 더 잘 흡수하며 문제를 풀도록 하자
정답코드
function solution(topping) {
// 롤케이크를 공평하게 나누는 경우의 수
let answer = 0;
// 중복된 값을 고려하지 않기위한 철수와 동생의 조각을 Set으로 정리
const aSet = new Set();
const bSet = new Set();
// index별로 잘랐을 때 철수와 동생이 몇 조각씩 취할 수 있는지를 담는 배열
const aLen = [];
const bLen = [];
// bLen의 경우 뒤에서부터 센 케이크 종류를 앞에서부터 담았기 때문에 나중에 뒤집어 줌
const bLenReverse = [];
// topping의 각 v와 인덱스 i별로
topping.forEach((v,i)=>{
// 철수는 앞에서부터, 동생은 뒤에서부터 하나씩 담아가면서
aSet.add(v);
bSet.add(topping[topping.length - 1 - i]);
// 해당 인덱스에서 자를 때의 철수와 동생이 취할 수 있는 종류의 수를 담음
aLen.push(aSet.size);
bLen.push(bSet.size);
})
// 동생의 경우 뒤집어 줌
for(let i = bLen.length - 1; i >= 0; i--){
bLenReverse.push(bLen[i]);
}
// 인덱스 i 와 i+1 사이를 잘랐을 때 둘의 토핑 개수가 같다면 answer++
for(let i = 0; i < topping.length - 1; i++){
if(aLen[i] === bLenReverse[i+1]) answer++;
}
return answer;
}
'알고리즘 문제풀이' 카테고리의 다른 글
프로그래머스 level 2 - 뒤에 있는 큰 수 찾기(Javascript) (0) | 2023.11.15 |
---|---|
프로그래머스 level 2 - 택배상자(Javascript) (1) | 2023.11.14 |
프로그래머스 level 2 - 미로 탈출(Javascript) (0) | 2023.11.10 |
프로그래머스 level 2 - k진수에서 소수 개수 구하기(Javascript) (0) | 2023.11.07 |
프로그래머스 level 1 - 신고 결과 받기(Javascript) (0) | 2023.11.07 |