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[] = { 12-1-2 };
 
int Bigger(int A, int B) { if (A > B) return A; return B; }
 
void Initialize()
{
    Answer = 0;
    memset(Building, 0sizeof(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

+ Recent posts