본문 바로가기
Computer/Algorithm_Java

[Programmers] 폰켓몬 (Success)

by HJ0216 2023. 9. 14.
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

Language: Java

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.util.Set;
import java.util.HashSet;
 
class Solution {
    public int solution(int[] nums) {
        int answer = 0;
        
        Set<Integer> set = new HashSet<>();
        for(int i : nums){
            set.add(i);
        }
        
        answer = set.size() <= nums.length/2 ? set.size() : nums.length/2;
        
        return answer;
    }
}
 
 

🤔 해설

1. Set<Integer> set = new HashSet<>();

   - set에 입력하여, 중복값 제거

2. answer = set.size() <= nums.length/2 ? set.size() : nums.length/2;

    - set 크기와 nums의 크기의 1/2을 비교하여 작은 값 return

 

😮  외의 풀이

1
2
3
4
5
6
7
8
9
10
11
12
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)));
    }
}
 
 

1. Arrays.stream(nums)

    - nums 배열을 stream으로 변환

2. boxed()

    - 스트림의 요소를 박싱(boxing)하여 Integer 객체로 변환

3. collect()

    - 스트림의 요소를 수집하고 다양한 중간 및 종료 연산을 수행

    - Collectors.toSet()

        - 스트림의 요소를 중복 없이 유일한 값만 포함하는 Set 컬렉션으로 수집

    - phonekemons -> Integer.min(phonekemons.size(), nums.length / 2)

       - phonekemons: 중복을 제거한 Set 컬렉션 이름(Collectors.toSet()에서 생성된 Set 컬렉션에 대한 임시 변수의 이름)

 

⭐ 스트림: '데이터의 흐름’

- 배열 또는 컬렉션 인스턴스에 함수 여러 개를 조합해서 원하는 결과를 필터링하고 가공된 결과를 얻을 수 있음

- 람다를 이용해서 코드의 양을 줄이고 간결하게 표현할 수 있음

- 배열과 컬렉션을 함수형으로 처리할 수 있음

간단하게 병렬처리(multi-threading)가 가능

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.util.*;
 
class Solution {
    public int solution(int[] nums) {
        //1. 기존 length를 구한다.
        //2. 중복값을 제거한 length를 구한다.
        //3. 두 값중 최소값이 정답.
        List<Integer> list = new ArrayList<Integer>();
        for(int i = 0 ; i < nums.length; i++){
            if(!list.contains(nums[i])){
                list.add(nums[i]);
            }
        }
 
        return nums.length/2 > list.size()?list.size():nums.length/2;
    }
}
 
 

⭐ 풀 때, 로직 적어두고 풀기

 

 

 

🔗 소스 코드
GitHub

 

📚 참고 자료

 

Java 스트림 Stream (1) 총정리

이번 포스트에서는 Java 8의 스트림(Stream)을 살펴봅니다. 총 두 개의 포스트로, 기본적인 내용을 총정리하는 이번 포스트와 좀 더 고급 내용을 다루는 다음 포스트로 나뉘어져 있습니다. Java 스트

futurecreator.github.io

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr