728x90
오늘도 알고리즘 문제 연습을 했습니다.
프로그래머스의 정렬 Level2를 풀다가 머리가 깨질 것 같아서 잠시 덮어두고(이따 다시 도전할 예정입니다.)
해시 Level2 문제를 풀었습니다.
어제 해시 Level1을 연습해서 그런지, 이번 문제는 10분만에 풀었습니다. 기분이 좋습니다.
오늘 푼 문제는 해시 > Level2 폰켓몬 입니다.
import java.util.*;
class Solution {
public int solution(int[] nums) {
final Map<Integer, Integer> maps = new HashMap();
for (int num: nums) {
maps.put(num, maps.getOrDefault(num, 0)+1);
}
if (nums.length/2 <= maps.size()) {
return nums.length/2;
}
return maps.size();
}
}
사실 문제가 좀 쉬웠습니다.
그리고 IDE없이 코딩하는 것이 익숙해지고 있습니다.
다른 분들의 풀이도 한번 보았습니다.
import java.util.HashSet;
class Solution {
public int solution(int[] nums) {
HashSet<Integer> hs = new HashSet<>();
for(int i =0; i<nums.length;i++) {
hs.add(nums[i]);
}
if(hs.size()>nums.length/2)
return nums.length/2;
return hs.size();
}
}
이 풀이를 보니, 새삼 깨달았습니다. 이번 문제는 중복을 카운트 할 일이 없고, 오히려 중복을 제거하면 됐었네요.
어제 배운 '중복은 카운트다' 라는 공식에 꽂혀서 시야가 좁아졌던 것 같습니다.
'중복의 개수를 필요로 하는지, 아니면 중복을 제거해야 하는지' 경우를 나누어서 생각해야할 것 같습니다.
한 분 더 보겠습니다.
import java.util.Arrays;
import java.util.stream.Collectors;
class Solution {
public int solution(int[] nums) {
return Arrays.stream(nums)
.boxed()
.collect(Collectors.collectingAndThen(Collectors.toSet(),
phonekemons -> Integer.min(phonekemons.size(), nums.length / 2)));
}
}
저는 가능한 수를 구할 때, 공식을 생각했는데요(ex. maps.size() > nums.length / 2 ? nums.length / 2 : maps.size())
공식을 생각할 필요 없이 주어진 수는 모두 각자의 영역에서 최대값이니 이 중에서 "최소값"을 선택하면 됐습니다.
쉽게 풀어서 기분이 좋았는데, 최적의 솔루션이 더 있었네요ㅋㅋ
그래도 매일매일 익숙해지는 것 같아 기분 좋습니다.
728x90
'츄Log > 알고리즘 연습장' 카테고리의 다른 글
연습#6 H-Index (1) | 2023.12.06 |
---|---|
연습#5 가장 큰 수 (1) | 2023.12.06 |
연습#3 완주하지 못한 선수 (1) | 2023.12.04 |
연습#2 K번째수 (1) | 2023.12.03 |
연습#1 599. Minimum Index Sum of Two Lists (0) | 2023.12.03 |