Algorithm/Java

[Java 알고리즘] 백준 2635 수 이어가기

min민 2024. 10. 15.

[Java 알고리즘] 백준 2635 수 이어가기

 

//import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Main {
    public static void main(String[] args) throws IOException {

//        String filePath = "src/algorithms/Java_Skill_Boost_Challenge/수_이어나가기_2635/input.txt";
//        BufferedReader br = new BufferedReader(new FileReader(filePath));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        int maxLength = 0; // 최대길이
        int resultA = 0; // 두 번째 수
        ArrayList<Integer> bestSequence = new ArrayList<>();


        // 첫번째 수는 n으로 고정하고 j로 시작하면됨.
        for(int j = n; j >= 0; j--){
            int a = n; // 첫번째 수는 n
            int b = j; // 두번재 수는 j

            ArrayList<Integer> currentSequence = new ArrayList<>();
            currentSequence.add(a);
            currentSequence.add(b);
            int length = 2; // 이미 두개(n과 다음수)가 사용되었으니 2로 시작함.

            while(true){
                int c = a-b; // 다음 수
                if(c<0) break;
                currentSequence.add(c); //현재 수열에 추가
                a = b; // a를 b로 갱신
                b = c; // b를 c로 갱신
                length++; // 길이증가. n까지 못갔으니 숫자 계속추가.
            }

            if (length > maxLength){
                maxLength = length;
                resultA = j;
                bestSequence = currentSequence;
            }
        }

        System.out.println(maxLength);
        System.out.println(String.join(" ", bestSequence.stream().map(String::valueOf).toArray(String[]::new)));
    }

        /*
        1. 첫번째 수 양의 정수가 주어짐.
        2. 양의 정수중에서 하나 선택,
        3. 세번째 부터 이후에 나오는 모든 수는 앞의 수에서 앞의수를 빼서 만듦.
        ex) 세번째 수는 첫번째 수 - 두번째 수, 네번째 수 = 두번재 수 - 세번째 수
        4. 음의 정수가 만들어지면 음의 정수를 버리고 더이상 수를 만들지 않음.

        입력으로 첫번재 수가 주어지면 이 수에서 위의 규칙으로 만들어지는 최대 개수의 수를 구하는 프로그램 작성.
        최대 개수의 수들이 여러 개 일때 그중 하나의 수들만 출력하면 됨.


        브루트 포스 알고리즘으로
        1부터~ n-1까지 다빼보는걸 진행해보고 최대숫자의 값을 두자.
         */

}

 

  System.out.println(String.join(" ", bestSequence.stream().map(String::valueOf).toArray(String[]::new)));

 

sout : 출력하는것.

 

String.join(" ", ...): String.join은 주어진 구분자(여기서는 공백 " ")를 사용하여 배열의 문자열을 하나의 문자열로 결합한다. 결과적으로 각 문자열이 공백으로 구분된 단일 문자열이 된다.

 

bestSequence: 출력하고자 하는 변수. 컬렉션으로 위 코드에서는 list배열임

stream(): bestSequence에서 호출하여 요소들의 스트림을 생성합니다. 스트림은 요소들의 시퀀스에서 필터링, 매핑, 수집 등 여러 작업을 수행할 수 있게 해준다.

 

 

 

1. String.join(" ", words): words 리스트의 각 요소를 공백 " "으로 구분하여 하나의 문자열로 결합한다.

ex)

List<String> words = Arrays.asList("Hello", "world", "this", "is", "Java");

// 공백을 구분자로 사용하여 문자열 결합
String result = String.join(" ", words);

// 결과 출력
System.out.println(result);

 

결과:

Hello world this is Java

 

 

2. stream():

stream()은 Java 8에서 도입된 Stream API의 중요한 메서드 중 하나로, 컬렉션(예: List, Set, Map 등)에서 데이터를 처리하는 데 사용된다. Stream은 데이터를 처리하기 위한 함수형 프로그래밍 스타일을 제공하며, 다양한 연산을 수행할 수 있게 해준다.

 

중간 연산과 최종 연산:

스트림은 중간 연산(예: filter, map, sorted)과

최종 연산(예: collect, forEach, reduce)을 통해 데이터를 처리한다.

 

stream()은 Java에서 데이터 처리의 편의성을 높여주는 강력한 도구로, 함수형 프로그래밍 스타일을 적용하여 코드의 가독성과 간결성을 개선한다.

 

ex) 예시

import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        // 정수 리스트 생성
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        // 짝수만 필터링하고 제곱하여 출력
        numbers.stream() // 스트림 생성
            .filter(n -> n % 2 == 0) // 짝수 필터링
            .map(n -> n * n) // 각 짝수를 제곱
            .forEach(System.out::println); // 결과 출력
    }
}

결과:

4
16
36
64
100

 

 

위의 예시에서,

1. filter

filter 메서드는 스트림의 각 요소에 대해 주어진 조건을 만족하는지 테스트하고, 조건을 만족하는 요소만 남긴다.

 

2. map

map 메서드는 스트림의 각 요소를 주어진 함수에 따라 변환한다. 즉, 원래의 요소를 새로운 형태로 변환하는 역할을 한다.

 

3. forEach

forEach 메서드는 스트림의 각 요소에 대해 주어진 작업을 수행한다. 보통 결과를 출력하거나 사이드 이펙트를 발생시키는 데 사용됨.

 

그 외.

4. sorted

sorted 메서드는 스트림의 요소를 정렬. 기본적으로 오름차순으로 정렬하지만, 비교기를 제공하여 내림차순 정렬도 가능.

 

예시)

import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(5, 3, 8, 1, 4);

        // 숫자를 정렬하여 출력
        List<Integer> sortedNumbers = numbers.stream()
            .sorted() // 오름차순 정렬
          //  .sorted((a, b) -> b - a) // 람다를 사용한 내림차순 정렬
            .toList(); // 결과를 리스트로 수집

        System.out.println(sortedNumbers); // [1, 3, 4, 5, 8]
    }
}

5.collect

collect 메서드는 스트림의 결과를 수집하여 컬렉션(예: List, Set 등)으로 반환. 수집기를 사용하여 다양한 형태로 결과를 수집할 수 있다.

 

예시)

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", "cherry");

        // 모든 단어를 대문자로 변환하여 리스트로 수집
        List<String> upperCaseWords = words.stream()
            .map(String::toUpperCase) // 대문자로 변환
            .collect(Collectors.toList()); // 리스트로 수집

        System.out.println(upperCaseWords); // [APPLE, BANANA, CHERRY]
    }
}

 

6. reduce

reduce 메서드는 스트림의 요소를 결합하여 하나의 결과를 생성한다. 주로 집계 연산(예: 합계, 곱셈 등)에 사용된다.

import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

        // 모든 숫자의 합을 계산
        int sum = numbers.stream()
            .reduce(0, Integer::sum); // 0을 초기값으로 하고 합계 계산

        System.out.println(sum); // 15
    }
}

댓글