프로그래머스 - 롤케이크 자르기

홍성진·2023년 2월 15일
0

프로그래머스 - 롤케이크 자르기

주어진 정수 배열에서 특정 지점을 기준으로 양 쪽 원소들의 종류가 같으면 그 지점을 공평하게 자른 지점이라 지칭합니다. 이 때 공평하게 자를 수 있는 지점이 몇 개인지 구하는 문제입니다.
두 dictionary를 만들어, 양 쪽의 값을 갱신하며 size를 비교하는 방식으로 풀었습니다. 우선 back에 값을 전부 넣어두고, topping을 읽으며 forth에 값을 추가할건데, back에서 원소의 개수가 0이 되면 size를 줄일 수 있도록 remove 해주도록 합니다. 한편 forth에는 굳이 value를 정확히 유지할 필요가 없습니다.(Set을 써도 되겠네요)
forth의 size가 back보다 커지면 불필요한 계산을 막기 위해 break 해줍니다.

import java.util.*;

class Solution {
    public int solution(int[] topping) {
        HashMap<Integer, Integer> forth = new HashMap<>();
        HashMap<Integer, Integer> back = new HashMap<>();
        int answer = 0;
        
        for (int t : topping) {
            if (back.get(t) == null) {
                back.put(t, 1);
                continue;
            }
            back.put(t, back.get(t) + 1);
        }
        
        for (int t : topping) {
            int cur = back.get(t);
            
            if (cur == 1) {
                back.remove(t);
            } else {
                back.put(t, cur - 1);
            }
            
            if (forth.get(t) == null) {
                forth.put(t, 1);
            }
            
            if (compare(forth, back) < 0) {
                break;
            }
            
            answer += compare(forth, back);
        }
        return answer;
    }
    
    public int compare(HashMap<Integer, Integer> forth, HashMap<Integer, Integer> back) {
        int f = forth.size();
        int b = back.size();
        if (f == b) {
            return 1;
        }
        if (f > b) {
            return -1;
        }
        return 0;
    }
}

0개의 댓글