수집기(collector) : 스트림의 최종 연산(terminal operation) 중 하나로, 스트림의 요소를 수집하여 다양한 형태로 결과를 생성하거나 반환하는 역할을 한다.  

  1. toList(): 스트림의 요소를 리스트로 수집한다.
  2. toSet(): 스트림의 요소를 집합(Set)으로 수집한다.
  3. toMap(): 스트림의 요소를 맵(Map)으로 수집한다.
  4. joining(): 문자열 요소를 하나의 문자열로 연결한다.
  5. groupingBy(): 지정된 기준에 따라 스트림의 요소를 그룹화한다.

스트림과 수집기를 사용한 예시

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<String> words = Arrays.asList("apple", "banana", "grape", "watermelon", "orange");

        // 길이가 5 이상인 단어들을 대문자로 변환하여 리스트로 수집
        List<String> result = words.stream()
                                   .filter(word -> word.length() >= 5) // 길이가 5 이상인 단어 필터링
                                   .map(String::toUpperCase)           // 대문자로 변환
                                   .collect(Collectors.toList());      // 리스트로 수집

        // 결과 출력
        System.out.println("Result: " + result);
    }
}

 

핵심 정리 : 스트림 파이프라인 프래그래밍의 핵심은 부작용 없는 함수 객체에 있다. 스트림뿐 아니라 스트림 관련 객체에 건네지는 모든 함수 객체가 부작용이 없어야 한다. 종단 연산 중 forEach는 스트림이 수행한 계산 결과를 보고할 때만 이용해야 한다. 계산 자체에는 이용하지 말자. 스트림을 올바로 사용하려면 수집기를 잘 알아둬야 한다. 가장 중요한 수집기 팩터리는 toList, toSet, toMap, groupingBy, joining이다.

https://www.acmicpc.net/problem/1065

 

1065번: 한수

어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나

www.acmicpc.net

 

 

[난이도]

- Silver 4

 

[알고리즘]

- 부르트 포스

 

[코드]

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int N = Integer.parseInt(br.readLine());

        if (N < 100) {
            System.out.println(N);
        } else {
            int answer = 99;
            for (int i = 100; i <= N; i++) {
                int hundreds = i / 100; // 100의 자리
                int tens = (i / 10) % 10; // 10의 자리
                int units = (i % 10); // 1의 자리
                if ((hundreds - tens) == (tens - units)) {
                    answer++;
                }
            }
            System.out.println(answer);
        }
    }
}

 

[풀이]

N이 99이하일 경우에는 모든 수가 등차수열을 이룬다.

N이 100이상일 경우에는 (100의 자리 - 10의 자리) == (10의 자리 1의 자리) 일 경우에 등차수열을 이룬다 라고 말할 수 있다.

'코딩테스트' 카테고리의 다른 글

6186 Best Grass  (1) 2024.04.24
백준 17198: Bucket Brigade[JAVA]  (0) 2024.04.24
백준 4673: 셀프 넘버[JAVA]  (0) 2024.04.17
백준 14501: 퇴사[JAVA]  (0) 2024.04.17
백준 9290: 틱택토 이기기[JAVA]  (0) 2024.04.16

https://www.acmicpc.net/problem/4673

 

4673번: 셀프 넘버

셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때,

www.acmicpc.net

 

 

[난이도]

- Silver 5

 

[알고리즘]

- 부르트 포스

 

[코드]

import java.io.*;
import java.util.*;

public class Main {
    static boolean[] check = new boolean[10036];// selfNumber(9999) = 9999+9+9+9+9=10035가 최대값

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int n = 1;
        while (n <= 10000) {
            if (!check[n]) {
                bw.write(n + "\n");
            }
            selfNumber(n);
            n++;
        }
        bw.flush();
        bw.close();
        br.close();
    }

    static void selfNumber(int n) {
        int sum = 0;
        sum += n;
        String str = String.valueOf(n);
        for (int i = 0; i < str.length(); i++) {
            sum += str.charAt(i) - '0';
        }
        check[sum] = true;
    }
}

 

[풀이]

1. 1부터 시작해 check[n] 이 false일 경우 해당 숫자를 출력한다. check[n] 이 true일 경우에는 출력하지 않는다.

2. selfNumber(n)을 수행후 나온결과의 값을 sum이라 할 때, check[sum] = true  해준다.

3. n이 10000을 넘어갈 경우 반복문 탈출 후 출력

'코딩테스트' 카테고리의 다른 글

백준 17198: Bucket Brigade[JAVA]  (0) 2024.04.24
백준 1065: 한수[JAVA]  (0) 2024.04.17
백준 14501: 퇴사[JAVA]  (0) 2024.04.17
백준 9290: 틱택토 이기기[JAVA]  (0) 2024.04.16
백준 5568: 카드 놓기[JAVA]  (0) 2024.04.14

스트림 : 데이터 요소들의 연속된 시퀀스를 처리하는 데 사용된다. 스트림은 컬렉션, 배열 등의 데이터 소스로부터 데이터를 읽어들이고, 그 데이터를 변환하거나 조작할 수 있는 기능을 제공한다.

 

스트림을 사용한다고 무조건 더 코드가 좋아지지는 않는다. 스트림을 과도하게 사용하면 프로그램이 읽거나 유지보수하기 더 어려워진다. 특히 스트림에 익숙하지 않은 프로그래머라면 더욱 그렇다. 이를 절충하기 위해 스트림을 적당히 사용하면 명확하게 이해하기 좋아진다.

 

핵심 정리 : 스트림을 사용해야 멋지게 처리할 수 있는 일이 있고, 반복 방식이 더 알맞은 일도 있다. 그리고 수많은 작업이 이 둘을 조합했을 때 가장 멋지게 해결된다. 어느 쪽을 선택하는 확고부동한 규칙은 없지만 참고할 만한 지침 정도는 있다. 어느 쪽이 나은지가 확연히 드러나는 경우가 많겠지만, 아니더라도 방법은 있다. 스트림과 반복 중 어느쪽이 나은지 확신하기 어렵다면 둘 다 해보고 더 나은 쪽을 택하라.

https://www.acmicpc.net/problem/14501

 

14501번: 퇴사

첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다.

www.acmicpc.net

 

 

[난이도]

- Silver 3

 

[알고리즘]

- 부르트 포스

- dfs

 

[코드]

import java.io.*;
import java.util.*;

public class Main {
    static int N, maxPay = Integer.MIN_VALUE;
    static int[][] arr;
    static boolean[] checked;
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        N = Integer.parseInt(br.readLine());

        arr = new int[N][2];
        checked = new boolean[N];

        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            arr[i][0] = Integer.parseInt(st.nextToken());
            arr[i][1] = Integer.parseInt(st.nextToken());
        }

        dfs(0, 0);
        System.out.println(maxPay);

    }

    static void dfs(int index, int pay) {
        if (index >= N) {
            maxPay = Math.max(maxPay, pay);
            return;
        }

        if (index + arr[index][0] <= N) { // 날짜를 초과하지 않는다면
            dfs(index + arr[index][0], pay + arr[index][1]); // 상담을 진행 후의 날짜, 금액을 추가해 넘겨준다
        } else { // 날짜를 초과한다면
            dfs(index + arr[index][0], pay); // 금액을 추가하지않고 넘겨준다, 다음 if문에서 걸리기 때문
        }
        dfs(index + 1, pay); // 완전 탐색하기위한 코드, 0일부터시작, 1일부터 시작, ...
    }
}

 

[풀이]

1. index가 N을 초과할 경우 현재까지 쌓인 pay중의 최대값을 maxPay에 저장한다.

2 - 1. 현재날짜에서 상담 후의 날짜가 N을 초과하지 않는다면 (상담 후의 날짜, 상담 후의 금액)을 넘겨준다.

2 - 2. 현재날짜에서 상담 후의 날짜가 N을 초과한다면(상담 후의 날짜, 상담 전의 금액)을 넘겨준다. 이렇게 하는 이유는 다음 if문에서 걸려 maxPay를 갱신하기 위함이다.

3. 0일째부터 상담 시작했을 경우가 끝났다면, 다시 1일부터 상담 시작했을 경우, 2일부터 상담 시작했을 경우... 로 계속진행한다. N + 1일부터 상담 시작했을 경우까지 갔을 경우 끝난다.

 

'코딩테스트' 카테고리의 다른 글

백준 1065: 한수[JAVA]  (0) 2024.04.17
백준 4673: 셀프 넘버[JAVA]  (0) 2024.04.17
백준 9290: 틱택토 이기기[JAVA]  (0) 2024.04.16
백준 5568: 카드 놓기[JAVA]  (0) 2024.04.14
백준 1639: 행운의 티켓[JAVA]  (0) 2024.04.13

+ Recent posts