문제

  • 링크
    title: "코딩테스트 연습 - 롤케이크 자르기"
    image: "https://image.freepik.com/free-vector/landing-page-template-for-a-website_23-2147782747.jpg"
    description: "철수는 롤케이크를 두 조각으로 잘라서 동생과 한 조각씩 나눠 먹으려고 합니다. 이 롤케이크에는 여러가지 토핑들이 일렬로 올려져 있습니다. 철수와 동생은 롤케이크를 공평하게 나눠먹으려 하는데, 그들은 롤케이크의 크기보다 롤케이크 위에 올려진 토핑들의 종류에 더 관심이 많습니다. 그래서 잘린 조각들의 크기와 올려진 토핑의 개수에 상관없이 각 조각에 동일한 가짓수의 토핑이 올라가면 공평하게 롤케이크가 나누어진 것으로 생각합니다."
    url: "https://school.programmers.co.kr/learn/courses/30/lessons/132265"
    

문제 풀이

문제 접근

간단한 수도 코드 정리

Type/Paste Your Code

풀이 코드

import java.util.*;

class Solution {
    public int solution(int[] topping) {
        int answer = 0;
        int left = 0;
        int right = topping.length - 1;

        // Initialize sets for left and right side toppings
        Set<Integer> leftSet = new HashSet<>();
        Set<Integer> rightSet = new HashSet<>();

        // Array to store unique topping count up to each index from the left
        int[] leftUnique = new int[topping.length];
        for (int i = 0; i < topping.length; i++) {
            leftSet.add(topping[i]);
            leftUnique[i] = leftSet.size();
        }

        // Array to store unique topping count up to each index from the right
        int[] rightUnique = new int[topping.length];
        for (int i = topping.length - 1; i >= 0; i--) {
            rightSet.add(topping[i]);
            rightUnique[i] = rightSet.size();
        }

        // Compare the unique topping count in left and right part using binary search
        for (int i = 0; i < topping.length - 1; i++) {
            if (leftUnique[i] == rightUnique[i + 1]) {
                answer++;
            }
        }

        return answer;
    }
}