[BOJ] 11053번 | κ°€μž₯ κΈ΄ μ¦κ°€ν•˜λŠ” λΆ€λΆ„ μˆ˜μ—΄ (C++)

2023. 8. 29. 16:50ㆍCoding Test/BOJ

πŸ”—λ¬Έμ œ λ³΄λŸ¬κ°€κΈ°
 

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
λ°˜μ‘ν˜•