일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Android
- androidstudio
- bitmap
- BOJ
- Canvas
- CS
- Database
- DBeaver
- DP
- Ecilpse
- Eclipse
- firebase
- git
- github
- GooglePlayServices
- gradle
- IDE
- IntelliJ
- java
- json
- kotlin
- level2
- linux
- mariadb
- MYSQL
- Paint
- permission
- python
- Sorting
- sourcetree
Archives
will come true
[프로그래머스 / Level1] 폰켓몬 (Java) 본문
728x90
문제
https://programmers.co.kr/learn/courses/30/lessons/1845?language=java
풀이
- 연구실에 있는 N마리의 폰켓몬 중 N/2마리를 선택
- 각 포켓몬은 종류별로 번호가 있으며, 최대한 다양한 종류로 포켓몬을 선택하고자 함
- 최대한 다양한 종류로 N/2마리 폰켓몬을 선택할 시, 종류 개수를 구하라.
- N은 항상 짝수
=> nums 배열의 요소들을 최대한 중복이 없게 N/2개 골랐을 때 '중복을 제거한 값의 개수'
★ "최대한 다양한 종류로" 라는 말이 붙으면 => "중복이 최대한 적게"로 해석 => Set 인터페이스 활용
기존 코드 (성공)
import java.util.*;
class Solution {
public int solution(int[] nums) {
Set<Integer> set = new TreeSet<>();
for(int num : nums){
set.add(num);
}
return set.size() > nums.length / 2 ? nums.length / 2 : set.size();
}
}
- 순서를 유지하지 않고, 중복을 허용하지 않는 Set의 특성을 이용해, int배열 nums의 값에서 중복을 전부 제거.
- 문제에서 구하고자 하는 것은 종류의 개수이기 때문에, set에 들어온 개수를 그대로 사용해도 괜찮으나, N(nums.length)의 절반만큼만 선택해야 하기 때문에 set의 사이즈가 N/2보다 클 경우에는 N/2값을 반환.
- 예를들어 nums = { 1, 2, 2, 1, 2, 2 } 일 경우, N/2 = 3마리의 폰켓몬을 선택할 수 있지만, 어떤 경우의 수로 3마리를 선택해봤자 하나는 반드시 중복에 걸려 최대 2종류의 폰켓몬 밖에 선택하지 못 한다. 그렇기 때문에 처음부터 N/2 값은 고려조차 하지 않고 중복을 제거한 종류수 많을 구한 것. (종류 수 <= 선택한 폰켓몬 수)
개선 코드 (성공)
import java.util.*;
class Solution {
public int solution(int[] nums) {
Set<Integer> set = new TreeSet<>();
for(int num : nums){
set.add(num);
}
return Math.min(set.size(), nums.length / 2);
}
}
- 기존에 삼항연산자로 set.size()가 nums.length 보다 클 경우 nums.length를 반환, 그렇지 않을 경우 set.size()를 반환하는 return문을 Math.min(int a, int b) 메서드를 사용해서 두 값 중 작은 쪽을 반환하는 것으로 변경.
어떤 값을 return하고 싶은지(최소값) 한 눈에 들어오게 됐다.
728x90
'Algorithm' 카테고리의 다른 글
[프로그래머스 / Level1] 모의고사 (Java) (0) | 2021.11.05 |
---|---|
[프로그래머스 / Level1] 소수 만들기 (Java) (0) | 2021.11.05 |
[프로그래머스 / 데모테스트] 나머지 한 점 (Java) (0) | 2021.11.04 |
[프로그래머스 / Level1] 두 개 뽑아서 더하기 (Java) (0) | 2021.11.04 |
[프로그래머스 / Level1] 비밀지도 (Java) (0) | 2021.11.01 |
Comments