📖 문제
코드트리 | 코딩테스트 준비를 위한 알고리즘 정석
국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.
www.codetree.ai
💡 풀이 방식
• 그리디
현재까지의 원소들의 합 sum과 0 중 더 큰 값을 찾는다.
이 값과 현재 위치의 원소를 더해 원소들의 합을 갱신한다.
원소들의 합과 최댓값을 비교해 더 큰 값으로 갱신한다.
🔺 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
import java.util.*;
import java.io.*;
public class Main {
static int N;
static int[] arr;
static int max = Integer.MIN_VALUE;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
arr = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for(int i = 0 ; i < N ; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
int sum = 0;
for(int i = 0 ; i < N ; i++) {
sum = Math.max(sum, 0) + arr[i];
max = Math.max(sum, max);
}
System.out.println(max);
}
}
|
cs |
➕ 다른 풀이 방식
현재 연속 부분 수열 내 원소의 합이 0보다 작아진다면, 그 다음 원소에서부터 새로운 연속 부분 수열을 만든다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
import java.util.Scanner;
public class Main {
public static final int MAX_N = 100000;
public static int n;
public static int[] arr = new int[MAX_N + 1];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
for(int i = 1; i <= n; i++)
arr[i] = sc.nextInt();
int ans = Integer.MIN_VALUE;
int sum = 0;
for(int i = 1; i <= n; i++) {
if(sum < 0)
sum = arr[i];
else
sum += arr[i];
ans = Math.max(ans, sum);
}
System.out.print(ans);
}
}
|
cs |
💦 어려웠던 점
- 애초에 시작 원소가 음수이고, 죄다 음수만 입력받을 때는 어떻게 해야하지라는 생각을 했었다
🧐 새로 알게 된 내용
- 현재 연속 부분 수열 내 원소의 합이 0보다 작아지면, 새로운 연속 부분 수열을 만든다.
- 그렇지 않다면, 기존 연속 부분 수열에 현재 원소를 추가한다.
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
(참고)
[알고리즘]배열의 부분 최대합
[알고리즘]배열의 부분 최대합주어진 배열에서 연속된 구간 중 합이 최대가 되는 곳을 찾는 문제이다. 다음과 같이 재열이 주어졌을 때, 2 ~ 4 구간의 합이 11로 최대값을 가진다. 이를 찾기 위한
studyposting.tistory.com
[ 스터디 ] 그리디 + 구현 실전 모의 코딩 테스트
더보기 스터디 친구들이 문제 가져오고, 제한 시간 내에 문제 푸는 방식으로 진행 1. 동전 더하기 1-1) 문제 1-2) 내 코드 n, k = map(int, input().split()) lst = [] count = 0 for i in range(n): coin = int(input()) lst.appe
all-young.tistory.com
'코테 > 코드트리' 카테고리의 다른 글
[코드트리/INTERMEDIATE LOW] 삼각형 컨베이어 벨트 (0) | 2023.12.30 |
---|---|
[백준/JAVA] 2615번: 오목 (0) | 2023.12.30 |
[코드트리/INTERMEDIATE MID] 동전 더하기 (JAVA) (0) | 2023.12.26 |
[코드트리/INTERMEDIATE LOW] 수들의 합 최대화하기 (JAVA) (0) | 2023.12.26 |
[코드트리/INTERMEDIATE LOW] 컨베이어 벨트 (JAVA) (0) | 2023.12.26 |