전체코드
import java.util.Scanner;
public class SWEA_View {
static final int T = 10;
static int N, arr[], idx, cnt;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
for (int test = 1; test <= T; test++) {
N = sc.nextInt();
arr = new int[N];
for (int i = 0; i < N; i++) {
arr[i] = sc.nextInt();
}
idx = 2; //0이후의 인덱스부터 시작
cnt = 0;
while (idx < N - 2) {
idx = chk(idx);//현재의 인덱스에서 갯수를 체크하고 리턴값으로 다음 인덱스를
//넘겨주는 방식으로 while문이 끝쪽 0에 다다를때까지 반복
}
System.out.println("#" + test + " " + cnt);
}
}
private static int chk(int idx) {
int maxIdxF = getMaxIdx(idx, 0); // 현재인덱스에서 앞쪽 두개의 가장 큰 값을 가진 인덱스 추출
int maxIdxB = getMaxIdx(idx, 1); // 마찬가지로 뒤쪽 두개에서 가장 큰값을 가진 인덱스 추출
if (arr[idx] > arr[maxIdxF] && arr[idx] > arr[maxIdxB]) { // 현재 인덱스의 값이 가장 크다면
cnt += arr[idx] - Math.max(arr[maxIdxF], arr[maxIdxB]); // 현재 값에서 앞쪽과 뒤쪽중 가장 큰값을 뺀 것을 cnt에 누적
return idx + 3; //그리고 현재 기준으로 앞뒤 두개는 검증이 끝났으므로, 3칸 앞의 인덱스로 이동
}else
return maxIdxF; // 현재 인덱스 값이 가장 크지 않다면, 앞쪽 두개 중 큰값의 인덱스로 이동
}
private static int getMaxIdx(int idx, int type) {
if(type == 0) //Front
return arr[idx + 1] > arr[idx + 2] ? idx + 1 : idx + 2;
else //Back
return arr[idx - 1] > arr[idx - 2] ? idx - 1 : idx - 2;
}
}
문제 핵심 코드
private static int chk(int idx) {
int maxIdxF = getMaxIdx(idx, 0); // 현재인덱스에서 앞쪽 두개의 가장 큰 값을 가진 인덱스 추출
int maxIdxB = getMaxIdx(idx, 1); // 마찬가지로 뒤쪽 두개에서 가장 큰값을 가진 인덱스 추출
if (arr[idx] > arr[maxIdxF] && arr[idx] > arr[maxIdxB]) { // 현재 인덱스의 값이 가장 크다면
cnt += arr[idx] - Math.max(arr[maxIdxF], arr[maxIdxB]); // 현재 값에서 앞쪽과 뒤쪽중 가장 큰값을 뺀 것을 cnt에 누적
return idx + 3; //그리고 현재 기준으로 앞뒤 두개는 검증이 끝났으므로, 3칸 앞의 인덱스로 이동
}else
return maxIdxF; // 현재 인덱스 값이 가장 크지 않다면, 앞쪽 두개 중 큰값의 인덱스로 이동
}
처음엔 앞쪽의 값들만 체크 했었는데, 앞쪽으로 가더라도 뒤의 값이 더 클수도 있다는 것을 인지한 후
뒤쪽값도 체크해 검증에 넣고 성공했다.
현재값이 가장 큰 경우와 그렇지 않은 경우 두 가지를 인지하는 것이 중요한 문제였다.
'알고리즘문제풀이' 카테고리의 다른 글
[JAVA] SWEA 1226 미로1 [BFS, DFS] (0) | 2020.08.17 |
---|---|
[JAVA] SWEA 7699 수지의 수지 맞는 여행 [BFS] (0) | 2020.08.17 |
[JAVA] SWEA 1234 비밀번호 (0) | 2020.08.16 |
[JAVA] SWEA 1228 암호문1 (0) | 2020.08.15 |
[JAVA] SWEA 1225 암호 생성기 (0) | 2020.08.15 |