본문으로 바로가기

[level2] 롤케이크 자르기 JAVA

category 코딩테스트/programmers 2023. 1. 5. 11:53

 

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

 

프로그래머스

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

programmers.co.kr


문제해석

- 롤케이크 위에 토핑 배열이 나란히 올려져 있다. 롤케이크를 잘라서 동생과 형이 나누어 먹는데 토핑 종류의 수로 나눈다.

    즉 1차원 배열 안에 들어가 있는 토핑 종류의 수를 똑같이 나누는 것!


 

1. 첫번째 시도

- HashMap을 이용하면 되는 문제라고 생각했다 -> 시간 초과!!!

import java.util.*;

class Solution {
    public int solution(int[] topping) {
        int answer = 0;
        
        int n = 1;
        while(n < topping.length-1){
            HashMap<Integer, Integer> map1 = new HashMap<>();
            HashMap<Integer, Integer> map2 = new HashMap<>();
            for(int i = 0; i < n; i++){
                map1.put(topping[i], 0);
            }
            
            for(int i = n; i < topping.length; i++){
                if(map1.size() < map2.size()){
                    break;
                }
                map2.put(topping[i], 0);
            }
            
            if(map1.size() == map2.size()) {
                answer++;
            }
            n++;
        }
         
        return answer;
    }
}

 

 

2. 두번째 시도

- 1번에서 시간 초과가 나온 것은 동일한 배열에서 1개씩 옆으로 넘기면 되는 문제인데,

  계속 hashmap을 만들고 넣고를 반복해서~~!! -> 문제를 너무 1차원 적으로 풀려고한다. 컬렉션 사용의 효율을 좀 더 고민!!

-> 먼저 HashMap에 배열을 다 넣어준뒤, 1개씩을 HashSet에 옮긴다. 그리고 둘의 사이즈를 비교한다.

    서로 다른 컬렉션을 사용하는 이유는 옆으로 넘길 때 남아있는 토핑의 갯수를 확인해야 하기 때문에! 0이면 종류에서 X

 

import java.util.*;

class Solution {
    public int solution(int[] topping) {
        int answer = 0;
        
        //롤케이크 토핑의 종류를 hashMap에 다 넣기
        HashMap<Integer, Integer> hm = new HashMap<>();
        HashSet<Integer> hs = new HashSet<>();
        for(int i = 0; i < topping.length; i++){
            hm.put(topping[i], hm.getOrDefault(topping[i], 0)+1);
        }
        
        for(int i = 0; i < topping.length-1; i++){
            int tmp = topping[i];
            //hs 넣고, hm엔 빼고
            if(!hs.contains(tmp)) hs.add(tmp);
            hm.put(tmp, hm.getOrDefault(topping[i], 0)-1);
            if(hm.get(tmp) == 0){
                hm.remove(tmp);
            }
            if(hm.size() == hs.size()) answer++;
        }
        return answer;
    }
}

'코딩테스트 > programmers' 카테고리의 다른 글

[level2]이모티콘 할인행사 JAVA  (0) 2023.01.09
[level] 점찍기 JAVA  (0) 2023.01.04
[level2]마법의 엘리베이터 JAVA  (0) 2023.01.04
[level3] 야근지수 JAVA  (0) 2022.11.24
[level3] 정수 삼각형 JAVA  (0) 2022.11.21