본문 바로가기
algorithm/Programmers, Jungol

[Programmers] 해시.폰켓몬 / HashMap 과 collectingAndThen

by buddev 2025. 4. 16.

https://school.programmers.co.kr/learn/courses/30/lessons/1845

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

문제 자체는 매우 간단한데, 다른 풀이가 인상깊어서 포스팅 합니다.

 

 

내 풀이

import java.util.HashSet;
import java.util.Set;

class Solution {

    public int solution(int[] nums) {
        
        Set<Integer> set = new HashSet<>();
        for (int num : nums) {
            set.add(num);
        }

        return Math.min(set.size(), nums.length / 2);
    }
}

 

 

인상깊었던 풀이

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)));
    }
}

 

 

사실 min 값과 set size를 비교하는 로직 자체는 동일한데,

간단한 알고리즘 문제라서 stream까지는 쓸 생각을 못해봤습니다.

게다가 collectingAndThen은 자주 안 써서, 이번 기회에 한번 더 짚고 넘어가서 좋았습니다.

 

 

collectingAndThen이란?

"어떤 방식으로 데이터를 수집한 후, 추가 가공이 필요할 때" 사용

Collectors.collectingAndThen(Collector<T,A,R> downstream, Function<R,RR>)

구성:

  • 첫 번째 인자: 기존의 수집기(Collector) — 데이터를 모으는 방식
  • 두 번째 인자: 후처리 함수(Function) — 수집 결과에 추가 동작을 수행함
 
collect(Collectors.collectingAndThen(
	Collector<T, A, R> downstream,		// 1단계: 데이터를 수집해서 R 결과물 생성
	Function<R, RR> finisherFunction	// 2단계: 그 결과 R을 받아서 최종 RR 반환
))

finisherFunction은 앞에서 Collector가 반환한 최종 결과(R)를 그대로 넘겨받습니다.

 
Q. 두번째 인자의 작업을 처리할때, 이미 앞에서 처리한 collector의 정보를 가지고 있는 상태인가요?
 

A. "네, 가지고 있습니다." 입니다. collectingAndThen()의 두 번째 인자는, 첫 번째 수집기(Collector)가 완전히 처리된 결과물그대로 인자로 받아서 후처리를 수행합니다.

 

예: 폰켓몬 문제 다시 보기

.collect(Collectors.collectingAndThen(
	Collectors.toSet(),		// 1단계: Set<Integer> 생성됨 (중복 제거)
	phonekemons ->			// 2단계: Set<Integer>가 여기에 인자로 들어옴(phonekemons)
		Integer.min(phonekemons.size(), nums.length / 2)
));
  • 첫 번째 Collector: Collectors.toSet() → 중복 제거 완료된 Set 생성
  • 두 번째 Function: 이 Set을 기반으로 size() 등 연산 수행

댓글