SW Expert Academy - 1206. View

1 minute read

문제링크

문제설명

  • 강변에 빌딩들이 옆으로 빽빽하게 밀집한 지역이 있다.
  • 빌딩은 최대 255의 높이를 가지고 있고, 높이 1당 하나의 가구를 의미한다.
  • 각 세대가 조망권을 확보하기 위해서는 좌우로 2칸 이상의 공백이 존재해야 한다.
  • 조망권이 확보된 세대의 수를 반환하는 프로그램을 작성하라

문제접근

  • 입력 받는 N개의 빌딩 중 좌우 2칸씩(총 4칸)은 높이가 항상 0이다.
    • N개의 입력에 포함되는 것에 주의하자
  • 좌우로 2칸씩 빌딩의 높이 차이를 모두 구한다.
  • 4개의 값중 하나라도 음수인 경우 조망권을 확보하지 못한다.
  • 4개의 값이 모두 양수인 경우 최솟값이 조망권이 확보된 세대 수가 된다.
  • 모든 빌딩에 대해 위 로직을 반복한다.

구현

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(int argc, char** argv)
{
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);
	int test_case;
	int T = 10;
	// freopen("input.txt", "r", stdin);
	for (test_case = 1; test_case <= T; ++test_case)
	{
		int N; // 건물의 개수 = 가로의 길이
		scanf("%d", &N);
		vector<int> building(N, 0);
		for (int i = 0; i < N; i++) {
			scanf("%d", &building[i]);
		}

		vector<int> diff(4, 0);
		int cnt = 0;
		for (int i = 2; i < N - 2; i++) {
			diff[0] = building[i] - building[i - 1];
			diff[1] = building[i] - building[i - 2];
			diff[2] = building[i] - building[i + 1];
			diff[3] = building[i] - building[i + 2];
			if ((diff[0] > 0) && (diff[1] > 0) && (diff[2] > 0) && (diff[3] > 0)) {
				cnt += *min_element(diff.begin(), diff.end());
			}
		}
		printf("#%d %d\n", test_case, cnt);
	}
	return 0;//정상종료시 반드시 0을 리턴해야합니다.
}

Categories:

Updated:

Leave a comment