[c++] BOJ 1027 :: ๊ณ ์ธต ๊ฑด๋ฌผ

๋ฌธ์ œ

๊ณ ์ธต ๊ฑด๋ฌผ ๋ฌธ์ œ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์„ธ์ค€์‹œ์—๋Š” ๊ณ ์ธต ๋นŒ๋”ฉ์ด ๋งŽ๋‹ค. ์„ธ์ค€์‹œ์˜ ์„œ๋ฏผ ๊น€์ง€๋ฏผ์€ ๊ฐ€์žฅ ๋งŽ์€ ๊ณ ์ธต ๋นŒ๋”ฉ์ด ๋ณด์ด๋Š” ๊ณ ์ธต ๋นŒ๋”ฉ์„ ์ฐพ์œผ๋ ค๊ณ  ํ•œ๋‹ค. ๋นŒ๋”ฉ์€ ์ด N๊ฐœ๊ฐ€ ์žˆ๋Š”๋ฐ, ๋นŒ๋”ฉ์€ ์„ ๋ถ„์œผ๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค. i๋ฒˆ์งธ ๋นŒ๋”ฉ (1๋ถ€ํ„ฐ ์‹œ์ž‘)์€ (i,0)๋ถ€ํ„ฐ (i,๋†’์ด)์˜ ์„ ๋ถ„์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๊ณ ์ธต ๋นŒ๋”ฉ A์—์„œ ๋‹ค๋ฅธ ๊ณ ์ธต ๋นŒ๋”ฉ B๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋นŒ๋”ฉ์ด ๋˜๋ ค๋ฉด, ๋‘ ์ง€๋ถ•์„ ์ž‡๋Š” ์„ ๋ถ„์ด A์™€ B๋ฅผ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ๊ณ ์ธต ๋นŒ๋”ฉ์„ ์ง€๋‚˜๊ฑฐ๋‚˜ ์ ‘ํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค. ๊ฐ€์žฅ ๋งŽ์€ ๊ณ ์ธต ๋นŒ๋”ฉ์ด ๋ณด์ด๋Š” ๋นŒ๋”ฉ์„ ๊ตฌํ•˜๊ณ , ๊ฑฐ๊ธฐ์„œ ๋ณด์ด๋Š” ๋นŒ๋”ฉ์˜ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

ํ’€์ด

  • ๊ธฐ์šธ๊ธฐ๋ฅผ ๋น„๊ตํ•˜์—ฌ, ๋” ๊ธ‰๊ฒฉํ•œ ๊ธฐ์šธ๊ธฐ๊ฐ€ ๋‚˜์˜ค๋ฉด ๋ณด์ด์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ํŒ๋‹จ
  • ๊ฐ€์žฅ ๊ธ‰๊ฒฉํ•œ ๊ธฐ์šธ๊ธฐ๋ฅผ ๊ณ„์† ๊ฐฑ์‹ 
  • ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ์— ๋Œ€ํ•ด์„œ ๊ฐ๊ฐ ๋ณด์ด๋Š” ๊ฑด๋ฌผ ๊ฐœ์ˆ˜ ๊ณ„์‚ฐ
  • ์˜ฌ๋ ค๋‹ค๋ณผ ์ˆ˜๋„ ๋‚ด๋ ค๋‹ค๋ณผ ์ˆ˜๋„ ์žˆ์Œ

 

์ฝ”๋“œ

#include <iostream>
#include <math.h>

using namespace std;
int N;
long long height[50];

struct multiType {
    long long common;
    long long aMulti;
    long long bMulti;
    multiType(int c, int a, int b) {
        common = c;
        aMulti = a;
        bMulti = b;
    }
};

multiType* getCommonMulti(long long a, long long b) {
    long long aMulti = 2; long long bMulti = 2;
    long long newA = a; long long newB = b;
    while (newA != newB) {
        if (newA < newB) newA = a*aMulti++;
        else newB = b*bMulti++;
    }

    return new multiType(newA, aMulti-1, bMulti-1);
}

bool isUpSlope(pair<long long, long long> newIncline, pair<long long, long long> oldIncline) {
    auto multi = getCommonMulti(newIncline.second, oldIncline.second);

    newIncline.first *= multi->aMulti;
    newIncline.second *= multi->aMulti;
    oldIncline.first *= multi->bMulti;
    oldIncline.second *= multi->bMulti;

    if (newIncline.first > oldIncline.first) return true;
    else return false;
}

int getShownBuilding(int idx) {
    // ๋‚ด๋ ค๋‹ค๋ณผ ์ˆ˜๋„ ์žˆ๊ตฌ๋‚˜!
    int num = 0;
    pair<long long, long long> leftIncline = make_pair(-1e9, 1); // ๋ถ„์ž / ๋ถ„๋ชจ
    for (int i = idx-1; i >= 0; i--) {
        // ์™ผ์ชฝ
        pair<long long, long long> newIncline = make_pair(height[i] - height[idx], idx - i);

        if (!isUpSlope(newIncline, leftIncline)) continue;
        num++;
        leftIncline = newIncline;
    }

    pair<long long, long long> rightIncline = make_pair(-1e9, 1); // ๋ถ„์ž / ๋ถ„๋ชจ
    for (int i = idx + 1; i < N; i++) {
        // ์˜ค๋ฅธ์ชฝ
        pair<long long, long long> newIncline = make_pair(height[i] - height[idx], i - idx);

        if (!isUpSlope(newIncline, rightIncline)) continue;
        num++;
        rightIncline = newIncline;
    }

    return num;
}

int main() {
    // N์€ 50๋ณด๋‹ค ์ž‘์Œ
    // ํ•˜๋‚˜์”ฉ ์กฐํšŒํ•˜๋ฉด์„œ ์ขŒ์šฐ๋กœ ๊ธฐ์šธ๊ธฐ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ช‡ ๊ฐœ์ธ์ง€ ์„ธ๊ธฐ (๊ธฐ์šธ๊ธฐ๊ฐ€ ๋” ๊ธ‰๊ฒฉํ•ด์ง€๋ฉด ํ•ด๋‹น ๊ธฐ์šธ๊ธฐ๋กœ ๊ฐฑ์‹ 
    cin >> N;
    for (int i = 0; i < N; i++) {
        cin >> height[i];
    }


    int result = 0;
    for (int i = 0; i < N; i++) {
        int num = getShownBuilding(i);
        if (result < num) result = num;
    }
    cout << result;
}

 

๊ฐœ์„ 

  • isUpSlope๋ฅผ doudle์˜ ๋‚˜๋ˆ—์…ˆ ๊ณ„์‚ฐ์œผ๋กœ ๋ฐ”๊พธ๋ฉด ํŽธํ–ˆ๊ฒ ๋”ฐ.

 

๊ฒฐ๊ณผ

์•„์ด๋”” ๋ฉ”๋ชจ๋ฆฌ ์‹œ๊ฐ„ ์ฝ”๋“œ ๊ธธ์ด
gmldms784 2020 0 2037
๋ฐ˜์‘ํ˜•