본문 바로가기
알고리즘문제풀이

[JAVA] SWEA 1205 View

by Hindsight.. 2020. 8. 17.

전체코드

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; // 현재 인덱스 값이 가장 크지 않다면, 앞쪽 두개 중 큰값의 인덱스로 이동
}

 

처음엔 앞쪽의 값들만 체크 했었는데, 앞쪽으로 가더라도 뒤의 값이 더 클수도 있다는 것을 인지한 후

뒤쪽값도 체크해 검증에 넣고 성공했다.

현재값이 가장 큰 경우와 그렇지 않은 경우 두 가지를 인지하는 것이 중요한 문제였다.