🧩 문제
https://school.programmers.co.kr/learn/courses/30/lessons/1845
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
💡 내가 작성한 코드
import java.util.*;
class Solution {
public int solution(int[] nums) {
Set<Integer> set = new HashSet();
for (int i = 0; i < nums.length; i++) {
set.add(nums[i]);
}
return set.size() > nums.length / 2 ? nums.length / 2 : set.size();
}
}
- 중복된 포켓몬 제거
- 포켓몬의 종류를 중복 없이 세기 위해 빈 Set을 선언 (Set은 중복된 값을 허용하지 않기 때문)
- 빈 Set에 값 넣기
- 빈 Set에 중복된 값을 제거하면서 nums 배열의 요소를 add
- 결과 반환
- 최대 선택 가능한 포켓몬 수는 전체 포켓몬 수의 절반 (N/2)
- 중복되지 않은 포켓몬의 수가 최대 선택 가능한 포켓몬 수보다 크다면, 최대 선택 가능한 수를 반환
- 그렇지 않으면 중복되지 않은 포켓몬의 수를 반환
🧠 배운 점
- 처음에는 `int[] nums` 배열을 set으로 변경하는 방법을 생각하였습니다.
import java.util.*;
class Solution {
public int solution(int[] nums) {
Integer[] numsArray = Arrays.stream(nums).boxed().toArray(Integer[]::new);
Set<Integer> set = new HashSet(Arrays.asList(numsArray));
return set.size() > nums.length / 2 ? nums.length / 2 : set.size();
}
}
- 하지만 이 방법은 배열을 스트림으로 변환하고 박싱하는 단계가 추가되고, 이로 인해 불필요한 객체 생성 및 스트림 연산이 발생하므로 약간의 오버헤드가 발생되었습니다.
- 그래서 결과적으로 배열을 순회하면서 직접 HashSet에 추가하는 과정을 선택하여, 불필요한 중간 연산 및 객체 생성을 줄였습니다.
'코딩테스트' 카테고리의 다른 글
[프로그래머스] 자바(Java) - 구명보트 (0) | 2024.06.06 |
---|---|
[프로그래머스] 자바(Java) - 과일 장수 (0) | 2024.06.01 |
[프로그래머스] 자바(Java) - 모의고사 (0) | 2024.05.30 |
[프로그래머스] 자바(Java) - 2016년 (0) | 2024.05.18 |
[프로그래머스] 자바(Java) - 카드 뭉치 (0) | 2024.05.17 |