폰켓몬
🔗 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/1845
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
🚨맨 처음에 문제 푸는 방향성을 잘못 잡아서 먼 산을 돌아왔다 (..)
조합(Combination)을 통해서 풀었는데 브루트포스(완전탐색) 방식으로 nums.length가 커질수록 시간복잡도가 O(N!)에 가까워진다. 가장 비효율적이고 타임아웃이 나므로 수학적 사고 + 자료구조(Set)를 사용해서 풀어줘야 한다.
✅ 효율적으로 풀기
[문제 탐색]
- 선택할 수 있는 최대 수 : nums/2
- 폰켓몬 종류의 수 : Set.size() (중복제거)
- answer : 총 포켓몬 종류 수, nums/2 중 작은
[코드 설계]
- 자료구조 Set을 사용하여 중복 값을 제거하고 종류의 수 구하기
- 선택할 수 있는 최대 수 구하기
- 구한 두 수 중 작은 값이 정답
[가능한 시간복잡도]
Set의 add의 시간복잡도는 O(1) 이기 때문에 for문에서 N만큼 반복 : 시간 복잡도 O(N)
나머지 연산들은 O(1)로 상수 시간 연산
=> 전체 시간 복잡도 O(N)
✅풀이 코드
import java.util.*;
class Solution {
public int solution(int[] nums) {
int answer = 0;
HashSet<Integer> set = new HashSet<>();
for(int n : nums){
set.add(n);
}
answer = Math.min(set.size(), nums.length/2);
return answer;
}
}
'코딩테스트' 카테고리의 다른 글
[프로그래머스] 타겟 넘버(JAVA) 풀이 (0) | 2025.05.19 |
---|---|
[프로그래머스] 완주하지 못한 선수(JAVA) 풀이 (0) | 2025.05.07 |
[프로그래머스] K번째 수 자바(java) 풀이 (0) | 2024.11.08 |
[백준] 11866번 : 요세푸스 문제0 자바(JAVA) 풀이 (0) | 2024.10.25 |
[백준] 2193번 : 이친 자바(JAVA) 풀이 (0) | 2024.10.23 |