본문 바로가기
카테고리 없음

[SW Expert Academy] Intermediate / Array1 / 1206. [S/W 문제해결 기본] View

by 29살아저씨 2021. 8. 12.
반응형

Array1) 1204. View_

package array1;

import java.util.Scanner;
import java.io.FileInputStream;

class Solution {
	public static void main(String args[]) throws Exception {

		// txt 파일 읽어오는 소스코드
		// System.setIn(new FileInputStream("res/1206_input.txt"));
		Scanner sc = new Scanner(System.in);
		// 행, 열, 테스트케이스길이, 정답
		int r, c, T;
		int ans = 0, secondView = 0;

		// 10개의 테스트 케이스 반복
		for (int test_case = 1; test_case <= 10; test_case++) {
			T = sc.nextInt();
			int matrix[][] = new int[255][T];

			// 건물 높이 저장
			int height[] = new int[T+1];
			for (int i = 0; i < T; i++) {
				c = sc.nextInt();
				height[i] = c;
				for (int j = 0; j < c; j++) {
					matrix[j][i]++;
				}
			}

			// 자신을 기준으로 양옆 4개의 건물 정렬, 조망권 계산
			for (int i = 2; i < T - 1; i++) {
				int array[] = new int[5];
				for (int j = 0; j <= 4; j++) {
					array[j] = height[i+j-2];
				}
				// array 변수에 자신을 중심으로 5개의 배열 저장, bubble sort를 이용하여 정렬
				int temp = 0;
				for (int k = array.length-1; k > 0; k--) {
					for (int j = 0; j < k; j++) {
						if (array[j]>array[j+1]) {
							temp = array[j];
							array[j] = array[j+1];
							array[j+1] = temp;
						}
					}
				}
				// 자신이 제일 큰 수일때 array[4]-array[3]이 조망값이 되므로 ans에 +해준다.
				if(height[i] == array[4]) {
					ans+=(height[i]-array[3]);
				}
			}System.out.printf("#%d %d\n", test_case, ans);
			ans = 0;
		}
	}
}

 

조망값을 어떻게 구할지에 대해서 제일 많이 고민을 했던 것 같다.

자신을 기준으로 왼쪽과 오른쪽 모두 거리 2 이상의 공간이 확보될 떄 조망권이 확보된다고 말하기 때문에

자신을 중심으로 왼쪽, 오른쪽 2개의 건물 중 자신이 가장 높은 건물일 때 자신의 높이 - 두번째로 높은 건물의 높이를 구하면 조망권이 확보된 층 수를 얻을 수 있다.

즉, 자신을 중심으로 왼쪽, 오른쪽 2개를 배열 따로 저장 -> 배열을 bubble sort를 이용하여 오름차순으로 정렬 -> int[4]가 자신일 때 int[4]-int[3]을 하여 조망권이 확보된 층 수를 구하도록 작성해보았다.

반응형

댓글