[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
}
}
'Algorithm > Java' 카테고리의 다른 글
백준(BOJ)에서 Java로 문제를 풀 때 알아야 할 핵심 팁들 및 제출시 주의사항 (0) | 2024.12.06 |
---|---|
[DFS로 탐색하기] 백준 2667번 JAVA : 단지 번호 붙이기 (0) | 2024.12.06 |
[Java 알고리즘] 백준 2309 일곱난쟁이 (1) | 2024.10.19 |
[Java 알고리즘] 백준 2669 직사각형 네개의 합집합의 면적 구하기 (0) | 2024.10.15 |
댓글