https://school.programmers.co.kr/learn/courses/30/lessons/132265
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의 길이를 반환한다.
해당 과정을 출력을 통해 알아보자
'코딩테스트 > 문제풀이 팁' 카테고리의 다른 글
[Kakao] "년/월/일" 날짜 문제 "일"로 모두 환산하기 (0) | 2024.03.14 |
---|---|
Stream, 되도록이면 사용하지 말자 (0) | 2024.02.26 |
[HashMap] 여러 요소와 요소의 개수세기 (0) | 2024.02.25 |
[PriorityQueue] 효율적인 스케줄링 (0) | 2024.02.21 |
시간 복잡도 계산 (1) | 2024.02.20 |