https://www.acmicpc.net/problem/11501
11501번: 주식
입력의 첫 줄에는 테스트케이스 수를 나타내는 자연수 T가 주어진다. 각 테스트케이스 별로 첫 줄에는 날의 수를 나타내는 자연수 N(2 ≤ N ≤ 1,000,000)이 주어지고, 둘째 줄에는 날 별 주가를 나타
www.acmicpc.net
문제 풀이 (JAVA)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
// 주식
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
long max = 0;
long sum = 0;
int N = Integer.parseInt(st.nextToken()); // 테스트케이스 수
long[] arr;
List<Long> list = new ArrayList<>();
for (int i = 0; i < N; i++) {
sum = 0;
int idx = 0;
max = 0;
int n = Integer.parseInt(br.readLine());
arr = new long[n];
st = new StringTokenizer(br.readLine(), " ");
while (st.hasMoreTokens()) {
arr[idx++] = Integer.parseInt(st.nextToken());
}
for (int j = n - 1; j >= 0; j--) {
long curMoney = arr[j];
if (curMoney > max) {
max = curMoney;
} else {
sum += (max - curMoney);
}
}
list.add(sum);
}
for (Long n : list) {
System.out.println(n);
}
}
}
문제 풀이
1. 해당 문제는 그리디 알고리즘 문제로 항상 최댓값에서 팔아야 하기 때문에 배열의 끝부터 탐색을 해야 한다.
2. 백준 문제 제출시 4%에서 오류가 발생한다면 변수를 Integer가 아닌 Long 타입으로 변환해주어야 한다. 숫자의 범위가 32bit를 넘기 때문이라고 한다.
3. for문을 배열의 끝부터 탐색하여 현재 값이 max 값일 경우, 값을 교체해주고 max가 아닐 경우 max값과 현재값의 차를 이익으로 누적하면 된다.
결론
: 그리디 알고리즘에는 다양한 문제 접근 방식이 필요한듯 하다. 필자는 문제 접근 방식이 생각나지 않아 다른 사람의 코드를 참고하였다.
'백준(JAVA)' 카테고리의 다른 글
[백준 2583번] 영역 구하기 (0) | 2023.02.12 |
---|---|
[백준 11403번] 경로 찾기 (0) | 2023.02.10 |
[백준 1806번] 부분합 (0) | 2022.12.04 |
[백준 1260번] DFS와 BFS (0) | 2022.12.04 |
[백준 1913번] 달팽이 (0) | 2022.08.15 |