알고리즘 문제풀이

프로그래머스 level 2 - 롤케이크 자르기(Javascript)

승큐니 2023. 11. 14. 10:10

(롤케이크 자르기)[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;
}