SW Expert Academy View(1206) 문제이다.
[ 문제풀이]
1) 입력으로 강물의 가로길이가 주어지고, 그 위에 아파트들의 높이들이 입력으로 주어진다. 가장 왼쪽 2칸과 가장 오른쪽2칸은
아파트가 들어설 수 없다. 한 아파트를 기준으로 왼쪽2칸과 오른쪽 2칸이 확보되면 조망권을 가질 수 있다고 표현할 때,
조망권이 확보된 세대의 수를 출력하는 것이 문제이다.
어떻게 접근해야 되는지 쉬운 예를 통해서 알아보자.
예를 들어서, 아파트의 높이가 { 0, 0, 3, 5, 2, 4, 9, 0, 6, 4, 0, 6, 0, 0 } 으로 주어졌다고 생각해보자.
조망권을 확보한 세대들에 집중해보자.(초록색으로 표시된 세대들)
조망권을 확보한 세대들을 가진 아파트가 되기 위해서는 특징을 하나 가져야 한다.
해당 아파트를 기준으로 왼쪽 2칸과, 오른쪽 2칸, 총 4개의 아파트들보다 높이가 더 높아야 한다는 것이다.
조망권을 확보한 세대들을 가진 아파트인, 2번 5번 8번 아파트에 주목해보자. 위에서 말한것과 같이, 비교할 4개의 아파트 보다
높이가 높다는 것을 알 수가 있다. 반대로, 조망권을 확보한 세대들을 가지지 못한 아파트인 1, 3, 4, 6, 7 번 아파트들을 보자.
비교할 4개의 아파트들보다 높이가 낮다는 것을 알 수 있다.
그렇다면, 아파트의 높이가 양쪽 4개의 아파트보다 더 높아야 한다는 사실을 알았으면, 세대의 수를 구해보자.
조망권을 가진 세대를 1세대 보유한 2번 아파트에 주목해보자.
양쪽 4개의 아파트들과 높이를 비교해보면
{ 0, 2, 5, 1, 4 } 가 된다. 이 때, 조망권을 확보한 세대는 1세대이다.
이 세대의 값은 해당 아파트의 높이 - (양쪽 4개의 아파트 중 최고높이) 라는 식을 도출해 낼 수 있다.
5번 아파트에서도 확인해보자.
5번 아파트와 양쪽 4개의 아파트들의 높이를 비교해보면
{ 1, 4, 9, 0, 6 } 이 되고, 세대의 수는 ( 1, 4, 0, 6 ) 중 최고높이인 6을 뺀 9 - 6 = 3. 즉 3세대가 조망권을 확보할 수 있게 된다.
위의 2가지만 구현을 잘해준다면 쉽게 해결할 수 있을 것이다.
[ 소스코드 ]
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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | #include<iostream> #include<cstring> #define endl "\n" #define MAX 1000 using namespace std; int N, Answer; int Building[MAX]; int dx[] = { 1, 2, -1, -2 }; int Bigger(int A, int B) { if (A > B) return A; return B; } void Initialize() { Answer = 0; memset(Building, 0, sizeof(Building)); } void Input() { cin >> N; for (int i = 0; i < N; i++) { cin >> Building[i]; } } void Solution() { int Sum = 0; for (int i = 2; i < N - 2; i++) { int Cur_Height = Building[i]; int Size_Max_Height = Bigger(Building[i - 2], Bigger(Building[i - 1], Bigger(Building[i + 1], Building[i + 2]))); if (Cur_Height > Building[i - 1] && Cur_Height > Building[i - 2] && Cur_Height > Building[i + 1] && Cur_Height > Building[i + 2]) { Sum = Sum + (Cur_Height - Size_Max_Height); } } Answer = Sum; } void Solve() { int Tc = 10; for (int T = 1; T <= Tc; T++) { Initialize(); Input(); Solution(); cout << "#" << T << " " << Answer << endl; } } int main(void) { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); //freopen("Input.txt", "r", stdin); Solve(); return 0; } | cs |
'[ SWEA Code ] > # SWEA - ' 카테고리의 다른 글
[ SWEA 1251 ] 하나로 (C++) (2) | 2019.03.04 |
---|---|
[ SWEA 1211 ] Ladder2 (C++) (0) | 2019.02.20 |
[ SWEA 1244 ] 최대상금 (C++) (0) | 2019.02.19 |
[ SWEA 1210 ] Ladder1 (C++) (0) | 2019.02.19 |
[ SWEA 1208 ] Flatten (C++) (0) | 2019.02.19 |