백준 1912번 연속합 (Java)

DongHyun Kim·2022년 7월 20일
0

알고리즘 풀이

목록 보기
2/12
post-thumbnail

나열된 숫자열에서 연속된 수를 합쳤을 때 최대의 값을 구하는 문제이다.
2가지 상태를 이용해 문제를 해결했다
1. 현재 보고있는 수에서 연속된 합을 임시 저장하는 tmp1
2. 현재 보고있는 수와 연속이 아닌 합을 임시 저장하는 tmp2
왼쪽부터 1개씩 숫자를 볼 때 보고있는 수가 음수인 경우와 양수인 경우로 나눠서 생각하여 단순하게 풀었다.

	public static void main(String[] args) throws Exception{
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(bf.readLine());
		StringTokenizer st = new StringTokenizer(bf.readLine());
		int[] num = new int[n];
		for(int i = 0; i<n; i++) {
			num[i] = Integer.parseInt(st.nextToken());
		}
		int tmp1 = num[0];
		int tmp2 = num[0];
		int max = tmp1;
		for(int i = 1; i < n; i++) {
			if(num[i] < 0) {
				if(tmp1 > tmp2) {
					tmp2 = tmp1;
				}
				if(tmp1 + num[i] > 0) {
					tmp1 += num[i];
				}
				else {
					tmp1 = num[i];
				}
			}
			else {
				if(tmp1 > 0) {
					tmp1 += num[i];
				}
				else {
					tmp1 = num[i];
				}
			}
		}
		if(tmp1 > tmp2) {
			max = tmp1;
		}
		else {
			max = tmp2;
		}
		System.out.println(max);
	}

더 짧은 풀이로는 배열 하나(ex. arr)를 이용해 arr[i+1] = max(arr[i] + 현재 값, 현재 값) 을 숫자열 길이만큼 반복한 뒤 arr배열 중 가장 큰 수를 출력하는 것이 있다.

profile
do programming yourself

0개의 댓글