Tesseractjh
한 걸음씩
Tesseractjh
전체 방문자
오늘
어제
  • 전체 (293)
    • IT (30)
      • JavaScript (7)
      • TypeScript (5)
      • React (5)
      • Next.js (3)
      • MongoDB (2)
      • Webpack (2)
      • HTML & CSS (1)
      • Git (0)
      • AWS (1)
      • 기타 (4)
    • 연습장 (259)
      • 백준(BOJ) 문제풀이 (185)
      • 프로그래머스 문제풀이 (61)
      • LeetCode 문제풀이 (2)
      • HackerRank 문제풀이 (7)
      • 낙서장 (3)
      • 기타 (1)
    • 프로젝트 (3)
      • 지뢰피하기 (1)
      • 키릴-라틴 문자 변환기 (1)
      • Flex & Grid (1)
    • 멋쟁이사자처럼 프론트엔드 스쿨 1기 (1)
      • 일기 & 회고록 (1)

인기 글

티스토리

hELLO · Designed By 정상우.
Tesseractjh

한 걸음씩

[프로그래머스 Level 2] 롤케이크 자르기 - JavaScript
연습장/프로그래머스 문제풀이

[프로그래머스 Level 2] 롤케이크 자르기 - JavaScript

2022. 10. 31. 12:18

🔗 문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/132265

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

✏️ 풀이

function solution(topping) {
    const left = {};
    const right = topping.reduce((acc, v) => {
        acc[v] = (acc[v] ?? 0) + 1;
        return acc;
    }, {});
    
    let leftCount = 0;
    let rightCount = new Set(topping).size;
    let answer = 0;
    
    for (let i = 0; i < topping.length - 1; i++) {
        const curTopping = topping[i];
        if (!left[curTopping]) {
            leftCount++;
        }
        left[curTopping] = (left[curTopping] ?? 0) + 1;
        
        right[curTopping]--;
        if (!right[curTopping]) {
            rightCount--;
        }
        
        if (leftCount === rightCount) {
            answer++;
        }
    }
    
    return answer;
}

처음에 한 사람이 모든 케이크를 다 갖고 있고, 거기서 한 조각씩 왼쪽부터 떼어준다는 가정을 하고 left와 right에 현재 갖고 있는 토핑의 개수를 저장하였다. left는 처음에 한 조각도 갖고 있지 않기 때문에 비어 있고, right에는 모든 토핑의 종류별 개수가 저장되어 있다.

 

이 상태에서 topping을 순회하면서 각 토핑을 left에 추가하고 right에서는 빼는 과정을 반복한다. 이 때 leftCount와 rightCount로 현재 보유한 토핑 종류의 개수를 갱신한다. 토핑 종류의 개수는 Object.keys(left).length, Object.keys(right).length를 매번 구해서 비교하면 비효율적이기 때문에 따로 변수를 만들어서 갱신하였다. 토핑 종류의 개수가 같아질 때마다 answer를 증가시키면 케이크를 자르는 모든 방법의 개수를 구할 수 있다.

 

 

단순히 순회를 하면서 new Set(slice(0, i + 1))과 new Set(slice(i + 1))의 size를 비교하게 되면 Set을 만드는데 O(n)이 소요되므로 O(n^2)가 되어 시간 초과가 난다. 따라서 해시 테이블을 사용해서 시간을 단축해야 통과할 수 있다.

저작자표시 비영리 (새창열림)

'연습장 > 프로그래머스 문제풀이' 카테고리의 다른 글

[프로그래머스 Level 2] 혼자 놀기의 달인 - JavaScript  (0) 2022.11.04
[프로그래머스 Level 2] 연속 부분 수열 합의 개수 - JavaScript  (0) 2022.11.04
[프로그래머스 Level 2] 야간 전술보행 - JavaScript  (0) 2022.10.29
[프로그래머스 Level 3] 최고의 집합 - JavaScript  (0) 2022.10.18
[프로그래머스 Level 3] 불량 사용자 - JavaScript  (1) 2022.09.23
    '연습장/프로그래머스 문제풀이' 카테고리의 다른 글
    • [프로그래머스 Level 2] 혼자 놀기의 달인 - JavaScript
    • [프로그래머스 Level 2] 연속 부분 수열 합의 개수 - JavaScript
    • [프로그래머스 Level 2] 야간 전술보행 - JavaScript
    • [프로그래머스 Level 3] 최고의 집합 - JavaScript
    Tesseractjh
    Tesseractjh
    바닐라 자바스크립트를 좋아하는 개발자입니다

    티스토리툴바