๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ
728x90
๐Ÿ”—๋ฌธ์ œ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ
 

11053๋ฒˆ: ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด

์ˆ˜์—ด A๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ˆ˜์—ด A = {10, 20, 10, 30, 20, 50} ์ธ ๊ฒฝ์šฐ์— ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์€ A = {10, 20, 10, 30, 20, 50} ์ด

www.acmicpc.net

 

๐Ÿง‘๐Ÿป‍๐Ÿ’ปํ’€์ด ๊ณผ์ •

์ตœ์žฅ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด(LIS) ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ €์—๊ฒ ์ฒ˜์Œ ์ ‘ํ•ด๋ณด๋Š” ๊ฐœ๋…์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ•ด๋‹น ๊ฐœ๋…์— ๋Œ€ํ•ด ๋จผ์ € ๊ณต๋ถ€ํ•˜์˜€๊ณ , ๊ธฐ์กด \( O(n^2) \)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์ง„ ํƒ์ƒ‰(Binary Search)์„ ํ™œ์šฉํ•˜์—ฌ \( O(nlogn) \)์œผ๋กœ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

(๐Ÿ”—์ฐธ๊ณ  ๋ธ”๋กœ๊ทธ)

 

๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. 

  1. ์ตœ์žฅ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด ์ˆซ์ž๋“ค์„ ๋‹ด์„ ๋ฐฐ์—ด์„ ์ค€๋น„ํ•œ๋‹ค.
  2. ์ž…๋ ฅ๋œ ์ˆซ์ž์— ๋Œ€ํ•˜์—ฌ, ๋‹ค์Œ ๊ณผ์ •์„ ์ง„ํ–‰ํ•œ๋‹ค.
    • ๋ฐฐ์—ด์ด ๋น„์—ˆ๊ฑฐ๋‚˜, ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰ ์›์†Œ๋ณด๋‹ค ์ž…๋ ฅ๋œ ์ˆซ์ž๊ฐ€ ํฌ๋‹ค๋ฉด, ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰ ์›์†Œ ๋’ค์— ์ถ”๊ฐ€ํ•œ๋‹ค.
    • ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด, ์ด์ง„ ํƒ์ƒ‰์„ ํ†ตํ•ด ์ž…๋ ฅ๋œ ์ˆซ์ž๊ฐ€ ๋“ค์–ด๊ฐˆ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ๋ฅผ ์ฐพ๋Š”๋‹ค.
      • ํ•ด๋‹น ์ธ๋ฑ์Šค์— ์ž…๋ ฅ๋œ ์ˆซ์ž๋ฅผ ์ €์žฅํ•œ๋‹ค.

 

๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰ ์›์†Œ ์ธ๋ฑ์Šค๋ฅผ i๋ผ๊ณ  ํ•˜๋ฉด, ๊ธฐ์กด \(O(n^2) \) ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ 0 ~ i - 1๊นŒ์ง€ ์ƒˆ๋กœ ์ž…๋ ฅ๋œ ์ˆซ์ž์™€ ๋น„๊ตํ•˜์—ฌ ๋“ค์–ด๊ฐˆ ์ž๋ฆฌ๋ฅผ ์ฐพ์•˜๋Š”๋ฐ, ์ด๊ฑธ ์ด์ง„ ํƒ์ƒ‰์„ ํ™œ์šฉํ•˜์—ฌ ํƒ์ƒ‰ ์‹œ๊ฐ„์„ ํฌ๊ฒŒ ์ค„์˜€๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ข…์ข… ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ผ ๊ฒƒ ๊ฐ™์•„, ์•Œ์•„๋‘๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋„ค์š”!

 

โœ๏ธ์†Œ์Šค ์ฝ”๋“œ ๋ฐ ๊ฒฐ๊ณผ

#include <iostream>
#include <vector>
#include <algorithm>
#define FAST_IO ios::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL);
using namespace std;

int GetIndexWithBinarySearch(const vector<int>& sequence, int data)
{
    if (sequence.empty())
        return 0;
    return lower_bound(sequence.begin(), sequence.end(), data) - sequence.begin();
}

int main()
{
    FAST_IO;

    int N;
    cin >> N;

    vector<int> sequence;

    for (int i = 0; i < N; i++)
    {
        int data;
        cin >> data;

        int index = GetIndexWithBinarySearch(sequence, data);
        if (index < sequence.size())
            sequence[index] = data;
        else
            sequence.push_back(data);
    }

    cout << sequence.size();
    return 0;
}

 

 

728x90
๋ฐ˜์‘ํ˜•