반응형

문제 링크

 

1027번: 고층 건물

세준시에는 고층 빌딩이 많다. 세준시의 서민 김지민은 가장 많은 고층 빌딩이 보이는 고층 빌딩을 찾으려고 한다. 빌딩은 총 N개가 있는데, 빌딩은 선분으로 나타낸다. i번째 빌딩 (1부터 시작)

www.acmicpc.net

 

풀이 )

  idx번째 건물에 대해서

  • 왼쪽에 있는 건물은 idx-1부터 0까지 기울기가 감소하면 반환값을 1씩 늘리고, 기울기를 갱신한다.
  • 오른쪽에 있는 건물은 idx+1부터 n까지 기울기가 증가하면 반환값을 1씩 늘리고, 기울기를 갱신한다.

 

  0번 건물은 왼쪽에 건물이 없기 때문에 오른쪽 건물에 대해서만 숫자를 세고

  n-1번 건물은 오른쪽에 건물이 없기 때문에 왼쪽 건물에 대해서만 숫자를 센다.

 

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int left(vector<int> v, int idx){
    int ret = 0;
    double m = 1e9;
    for(int i = idx-1; i >= 0; --i){
        if((double)(v[i]-v[idx])/(i-idx) >= m)
            continue;

        m = (double)(v[i]-v[idx])/(i-idx);
        ret++;
    }

    return ret;
}

int right(vector<int> v, int idx){
    int ret = 0, n = v.size();
    double m = -1e9;
    for(int i = idx+1; i < n; ++i){
        if((double)(v[i]-v[idx])/(i-idx) <= m)
            continue;

        m = (double)(v[i]-v[idx])/(i-idx);
        ret++;
    }

    return ret;
}

int main(void){
    int n;
    cin >> n;
    vector<int> v(n);
    for(int i = 0; i < n; ++i)
        cin >> v[i];

    int ans = right(v, 0);
    for(int i = 1; i < n-1; ++i)
        ans = max(ans, left(v, i)+right(v, i));
    ans = max(ans, left(v, n-1));

    cout << ans << '\n';
}
반응형

'문제풀이 > 백준' 카테고리의 다른 글

[C++] 백준 - 17828 : 문자열 화폐  (0) 2020.12.19
[C++] 백준 - 1987 : 알파벳  (0) 2020.12.19
[C++] 백준 - 4375 : 1  (0) 2020.12.12
[C++] 백준 - 1748 : 수 이어 쓰기 1  (0) 2020.12.12
[C++] 백준 - 5373 : 큐빙  (0) 2020.12.09

+ Recent posts