본문 바로가기
코딩테스트/문제풀이 팁

[HashSet, HashMap] 롤케이크 자르기

by asdft 2024. 2. 26.

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

 

프로그래머스

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

programmers.co.kr

import java.util.*;
class Solution {
    public int solution(int[] topping) {
        int answer = 0;
        HashSet<Integer> set = new HashSet<>();
        Map<Integer,Integer> map = new HashMap<>();
        
        for(int i=0;i<topping.length;i++){
            map.put(topping[i], map.getOrDefault(topping[i],0)+1);
        }

        for(int i=0;i<topping.length;i++){
            set.add(topping[i]);                        //set에 토핑하나주고
            map.put(topping[i], map.get(topping[i])-1); //map에 해당하는 토핑 하나 빼주기
    
            if(map.get(topping[i]) == 0){
                map.remove(topping[i]);                 // topping의 개수가 0인것은 remove 해줘야 size() 했을때 안나옴.
            }
            if(map.size() == set.size()){
                answer++;
            }

        }
        return answer;
    }
}

 

1. 하나는 토핑의 종류와 개수를 표현하기 위해 HashMap을 사용하고, 나머지 하나는 토핑의 개수보다는 중복을 허용하지      않는 토핑의 종류를 표현하기 위해 HashSet을 사용했다.

--> HashMap과 HashSet의 size( )가 같아질 때, 공평하게 나눈것으로 판명한다.

 

2. 어느 한 토핑의 종류가 개수가 0이되면 map.remove(topping[i])을 통해 map에서 제거해 줘야

    아래에서 size 비교에서 포함이 되지 않는다.

(중요!!)
HashMap에서 어느 한 토핑의 size( )가 0일 경우 map.remove( )를 통해서 제거해 줘야 한다.

그렇지 않으면 {1=2,2=1,3=0,4=1}과 같이 실제 3번 종류의 토핑은 0개이므로 총 토핑의 종류의 개수는 3개이지만 map.size( )로 출력해 볼 경우, 4가 나오게 된다.

 

 

여기서 쓴 Map표현

1. map.put( topping[i], map.getOrDafault(topping[i], 0)+1 )

key-value 형태로 map에 저장.

( key : topping[i] - value : key 값인 topping[i]값의 value가 map안에 있는지 확인하여,

  있을경우 value+1을, 없을경우 0+1을 한다. )

 

2. map.get(key)

key값에 해당하는 value값을 가져온다.

 

3. map.remove(key)

key값에 해당하는 key-value를 삭제한다.

 

3. map.size( )

map의 길이를 반환한다.

 


해당 과정을 출력을 통해 알아보자