별다른 거 없고 오름차순으로 정렬해주고, 누적합 구하면 끝나는 문제다.
정렬에 여러가지 경우의 수가 있는데 왜 별다른 거 없냐고 할 수도 있는데, 병합 정렬이나 퀵 정렬 삽입 정렬 중에 원하는 거 아무거나 사용해도 다 통과된다. 이 이상은 귀찮아서 테스트 안해봤다.
그 말은 즉 그냥 Arrays.sort()로도 다 된다는 말입니다..
아무튼 그렇게 풀면 재미도 없고 공부도 안되니까 최대한 직접 삽질하면서 풀어보자
우선 정렬은 어떻게 해야할까?
O(nlogn)의 시간 복잡도를 가진 퀵 정렬이나 병합 정렬을 구현해도 되지만 쓸 게 많아서 귀찮다.
사람 수가 1000명이기 때문에 시간 복잡도가 O(N^2)여도 별 문제가 안된다. 충분히 1초안에 가능한 수준의 연산이다.
따라서 나는 입력값을 받음과 동시에 정렬까지 할 수 있는 삽입 정렬을 택하겠다.
삽입정렬에 대해 작성하기 귀찮으므로 아래 블로그를 가보자.
https://gmlwjd9405.github.io/2018/05/06/algorithm-insertion-sort.html
이제 정렬을 했으면 누적합을 구해야 한다고 했다.
누적합은 정말 별 거 없고 누적합 배열 만들고, 계산하면 끝이다.
누적합 배열이란 이런 형태의 배열을 의미한다.
(누적합 배열 A, 기존 배열arr)
A[i] = A[i-1] + arr[i];
머리속으로 그려보면 알겠지만 이렇게 하면 A[i]는 arr[0] ~ arr[i]까지의 누적합을 가지게 된다.
그리고 누적합 배열을 구했으면 이제 다 더해주면 끝이다.
극한의 효율성을 챙기고 싶다면 값 입력 받기 + 삽입 정렬 + 누적합 배열 구하기 + 모두 더하기 까지 한 번에 하는 것도 가능하다.
하지만 실수할 확률만 늘어나고 가독성만 안 좋아질 것 같으니 평범하게 하자.
정답은 아래에.
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
31
32
33
34
35
36
37
38
39
40
41
42
43
|
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] arr = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
arr[0] = Integer.parseInt(st.nextToken());
// 입력 받기 + 정렬 시작
for (int i=1; i<N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
int key = arr[i];
int j=0;
for (j=i-1; j>=0; j--) {
if (key < arr[j]) {
arr[j+1] = arr[j];
} else {
break;
}
}
arr[j+1] = key;
}
// 정렬 끝
int[] sumArr = new int[N+1];
for (int i=0; i<N; i++) {
sumArr[i+1] = sumArr[i] + arr[i];
}
int answer = 0;
for (int n : sumArr) {
answer += n;
}
System.out.println(answer);
}
}
|
cs |
'CS ﹒ Algorithm > Baekjoon' 카테고리의 다른 글
Java 백준 문제풀이 (50) 1517 _ 버블소트 (0) | 2022.10.07 |
---|---|
백준 문제풀이(49) 수 정렬하기2 병합정렬 (0) | 2022.10.02 |
Java 백준 문제풀이 (47) 버블 소트 (0) | 2022.09.24 |
Java 백준 문제풀이 (46) 11286 : 절댓값 힙 (0) | 2022.09.17 |
백준 Java 문제풀이 (45) 스택 수열 (0) | 2022.09.14 |