코딩테스트

[프로그래머스] 자바(Java) - 폰켓몬

수방방 2024. 5. 23. 22:12

🧩 문제

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();
    }
}
  1. 중복된 포켓몬 제거
    • 포켓몬의 종류를 중복 없이 세기 위해 빈 Set을 선언 (Set은 중복된 값을 허용하지 않기 때문)
  2. 빈 Set에 값 넣기
    • 빈 Set에 중복된 값을 제거하면서 nums 배열의 요소를 add
  3. 결과 반환
    • 최대 선택 가능한 포켓몬 수는 전체 포켓몬 수의 절반 (N/2)
    • 중복되지 않은 포켓몬의 수가 최대 선택 가능한 포켓몬 수보다 크다면, 최대 선택 가능한 수를 반환
    • 그렇지 않으면 중복되지 않은 포켓몬의 수를 반환

🧠 배운 점

  1. 처음에는 `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에 추가하는 과정을 선택하여, 불필요한 중간 연산 및 객체 생성을 줄였습니다.