알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

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

 

2670번: 연속부분최대곱

첫째 줄은 나열된 양의 실수들의 개수 N이 주어지고, 그 다음 줄부터 N개의 수가 한 줄에 하나씩 들어 있다. N은 10,000 이하의 자연수이다. 실수는 소수점 첫째자리까지 주어지며, 0.0보다 크거나

www.acmicpc.net


Think🤔

처음에 받을 숫자를 입력하고 , 그 다음 소수점 숫자들을 받는다.

숫자들 중에서 연속적인 숫자 값이 제일 크면 그 값이 답이 되고, 소수점 셋째 자리까지 출력하고 리턴하면 되는 문제.


Solution✍
package back22y03;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class seqNumber {
	
	// double을 바꿔주는 dStr
	public static double dStr(String str) {
		return Double.parseDouble(str);
	}

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		
		int num = Integer.parseInt(bf.readLine());
		
		double[] dArr = new double[num];
		for(int i=0; i<num; i++) {
			dArr[i] = dStr(bf.readLine());
		}
		
		double max = dArr[0];
		
		for(int i=1; i<num; i++) {
			dArr[i] = Math.max(dArr[i], dArr[i-1] * dArr[i]);
			max = Math.max(max,dArr[i]);
		}
		
		System.out.printf("%.3f", max);
	}

}

double을 바꿔주는 dStr을 만들어주고 , Double.parseDouble(str)로 리턴해준다.

 

두 번째 반복문은, dArr[1]에 지금 값이 크면 지금 값을 넣어주고 ,

연속된 곱이 지금 값 보다 크면 max에 그 값을 넣어준다.

dArr[i]에는 전에 연속된 값들이 만약에 더 크면 그 전 값과 곱해서 dArr[i]에 저장하고 더 큰 값을 누적해서 넣어주는 방법.

 

package back22y03;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class seqNumber {
	
	// double을 바꿔주는 dStr
	public static double dStr(String str) {
		return Double.parseDouble(str);
	}

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		
		int num = Integer.parseInt(bf.readLine());
		
		double[] dArr = new double[num];
		for(int i=0; i<num; i++) {
			dArr[i] = dStr(bf.readLine());
		}
		
		double max = dArr[0];
		
		for(int i=1; i<num; i++) {
			dArr[i] = Math.max(dArr[i], dArr[i-1] * dArr[i]); // 현재 위치에서 연속된 값 중 큰 값
			System.out.println("dArr[i] : " + dArr[i] + " i가 : " + i + "  ,max : " + max);
			max = Math.max(max,dArr[i]); // 연속된 곱에서 제일 큰 값
		}
		
		System.out.printf("%.3f", max);
	}

}

이해가 잘 되지 않아서, 변화 값들을 찍어보았다.

누적된 값을 dArr[i]에 넣어줌으로써, 계속 누적한값이 max보다 커지면 max에 들어가는 방식

1.638보다 큰 연속된 숫자들을 넣어서 sysout으로 찍어서 이해할 수 있었다.


Review🤩

방법이 생각나지 않아서, 참조한 부분이 있었습니다~


 

'Algorithm' 카테고리의 다른 글

[프로그래머스] 나머지가 1이 되는 수 찾기 , 같은 숫자는  (0) 2022.03.09
[백준] 추월  (0) 2022.03.08
[백준] 설탕 배달  (0) 2022.02.28
[백준] 숫자의 합  (0) 2022.02.28
[인프런] 아나그램(해쉬)  (0) 2022.02.27

+ Recent posts