오늘은 백준 3052번 '나머지' 문제를 풀어보았다.
알고리즘 공부를 시작한 지 얼마 되지 않아 기초적인 문제부터 차근차근 풀어나가고 있는데,
이 문제에서 Java의 Stream API를 활용해볼 수 있어서 좋은 경험이 되었다.
문제 요약
문제 해석과 접근 방법
이 문제는 단순해 보이지만 몇 가지 중요한 개념을 포함하고 있다.
우선 나머지 연산(modulo)을 이해해야 하고, 중복된 값을 제거하는 방법을 알아야 한다.
처음에는 HashSet을 사용해 중복을 제거하는 방법을 생각했다.
HashSet은 중복을 허용하지 않는 자료구조이기 때문이다.
하지만 최근에 Java Stream API에 대해 공부하고 있어서 이를 활용해보고 싶었다.
Stream API를 사용하면 컬렉션의 요소를 함수형 프로그래밍 방식으로 처리할 수 있어 코드가 더 간결하고 가독성이 좋아진다고 생각한다.
구현 코드
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 동적 배열 생성
ArrayList<Integer> resultArray = new ArrayList<>();
// 줄마다 입력값을 읽어서 42로 나눈 나머지를 해당 인덱스에 추가
for (int i = 0; i < 10; i++) {
resultArray.add((Integer.parseInt(br.readLine()) % 42));
}
// Stream()에서 제공하는 distinct(), count()메서드 활용하여 distinct한 숫자들 카운트하기
System.out.println(resultArray.stream().distinct().count());
}
}
- BufferedReader를 사용해 입력을 효율적으로 받는다.
- 입력받은 값을 저장할 ArrayList를 생성한다.
- 10개의 숫자를 입력받아 각각 42로 나눈 나머지를 ArrayList에 추가한다.
- Stream()을 사용해 ArrayList를 스트림으로 변환한다.
- distinct()로 중복을 제거한다.
- count()로 남은 요소의 개수를 세어 출력한다.
Java Stream API에 대한 개념 정리
Java Stream API에 대해서도 개념 정리해보고자 한다.
Java 8에서 추가된 Stream API는 컬렉션의 요소를 람다식으로 처리할 수 있게 해주는 기능이다.
이를 통해 for문과 같은 반복문을 사용하지 않고도 내부 반복을 통해 작업을 수행할 수 있다.
Stream API의 주요 특징을 보자.
- 원본 데이터를 변경하지 않는다.
- 일회용이다(한 번 사용하면 재사용할 수 없다).
- 지연 연산을 통해 효율성을 높인다.
이 문제에서 사용한 주요 Stream 메서드를 볼까?
- stream(): 컬렉션을 스트림으로 변환한다.
- distinct(): 중복된 요소를 제거한다.
- count(): 스트림의 요소 개수를 반환한다.
함수형 프로그래밍에 익숙해지면 더 효율적인 코드를 작성할 수 있을 것 같다.
회고 및 느낀 점
이 문제는 어렵지 않았지만, Java의 여러 기능을 활용해볼 수 있는 좋은 기회였다.
특히 Stream API를 사용해서 중복 제거와 카운팅을 한 줄로 처리할 수 있다는 점이 인상적이었다.
위에서 말한 것과 같이 처음에는 HashSet을 사용해 중복을 제거하는 방법을 생각했다.
HashSet<Integer> set = new HashSet<>(resultArray);
System.out.println(set.size());
이 방법도 유효하지만, Stream API를 사용하여 더 간결하게 표현할 수 있었다.
알고리즘 공부를 하면서 느낀 점은 단순히 문제를 풀기보다는 각 문제에서 사용된 개념과 기술을 제대로 이해하는 것이 중요하다는 것이다.
이렇게 블로그에 정리하면서 복습하니 개념이 더 명확해지는 느낌이 크다!!!
'알고리즘' 카테고리의 다른 글
[알고리즘] 백준 10818번 - 최소, 최대 문제 풀이 (Java) (1) | 2025.04.15 |
---|---|
[알고리즘] 백준 2675번 - 문자열 반복 문제 풀이 (Java) (0) | 2025.04.08 |
[알고리즘] 백준 15552 빠른 A+B - Java (1) | 2025.01.07 |