프로그래머스 연습문제 롤케이크 자르기 [JAVA] - 23년 1월 19일

Denia·2023년 1월 19일
0

코딩테스트 준비

목록 보기
139/201
post-custom-banner

내 풀이

import java.util.HashMap;
import java.util.Map;

//3분 -> 21분 = 18분 걸림
//처음에 set을 이용하여 풀이하려고 했으나 set은 이전의 값들을 기억하지 못하므로 효율적이지 못함

//그래서 토핑의 가지수가 다르다 => hash의 key가 다르다에서 착안하여 map을 사용함

class Solution {
    public int solution(int[] topping) {
        int answer = 0;

        if (topping.length == 1) {
            return 0;
        }

        Map<Integer, Integer> leftSet = new HashMap<>();
        Map<Integer, Integer> rightSet = new HashMap<>();

        for (int topp : topping) {
            rightSet.put(topp, rightSet.getOrDefault(topp, 0) + 1);
        }

        for (int topp : topping) {
            leftSet.put(topp, leftSet.getOrDefault(topp, 0) + 1);

            int moveVal = rightSet.getOrDefault(topp, 0);
            if (moveVal - 1 == 0) {
                //이번에 삭제
                rightSet.remove(topp);
            } else {
                //수정값 적용
                rightSet.put(topp, moveVal - 1);
            }

            if (leftSet.size() == rightSet.size()) {
                answer++;
            }
        }

        return answer;
    }
}

다른사람 풀이 참고

class Solution {
    public int solution(int[] topping) {
        int answer = 0;
        int[] left = new int[10001], right = new int[10001];
        int ls = 0, rs = 0;
        for(int i : topping){
            if(right[i] == 0) rs++;
            right[i]++;
        }
        for(int i : topping) {
            right[i]--;
            if (right[i] == 0) rs--;
            if (left[i] == 0) ls++;
            left[i]++;
            if (rs == ls) answer++;
        }
        return answer;
    }
}

profile
HW -> FW -> Web
post-custom-banner

0개의 댓글