본문 바로가기

Study/algorithms

[백준] 2565 전깃줄

반응형

https://www.acmicpc.net/problem/2565

증가하는 가장긴 부분수열을 찾는 문제이다. 

#include <cstdio>
#include <algorithm>

using namespace std;
const int SIZE = 102;

int d[SIZE]; // 증가하는 부분수열 값 그 자체
pair<int, int> arr[SIZE];

int main() {
    int n; // eq-less 100
    scanf("%d", &n);
    for (int i = 0; i < n; ++i){
        scanf("%d %d", &(arr[i].first), &(arr[i].second));
    }
    sort(arr, arr+n);

    int idx = 0;
    int len = 0;
    d[0] = arr[0].second;
    for (int i = 1; i < n; ++i) {
        if (d[idx] < arr[i].second) {
            d[++idx] = arr[i].second;
        } else {
            int tmp = lower_bound(d, d+idx, arr[i].second) - d; // 들어갈자리를 찾아서 넣는다.
            d[tmp] = arr[i].second;
            ++len;
        }
    }

    printf("%d\n", len);
}

 

from bisect import bisect_left

def solve(n, arr):
    arr.sort(key=lambda x: x[0])

    d = []
    idx = 0
    length = 0
    d.append(arr[0])
    for i in range(1,n):
        if d[idx][1] < arr[i][1]:
            idx+=1
            d.insert(idx, arr[i])
        else:
            tmp = bisect_left([i[1] for i in d], arr[i][1], 0, idx)
            d[tmp] = arr[i]
            length += 1
    print(length)


if __name__ == "__main__":
    n = int(input())
    arr = [[int(j) for j in input().split()] for i in range(n)]

    solve(n, arr)

 

'Study > algorithms' 카테고리의 다른 글

[백준] 3036. 링  (0) 2020.02.15
[백준] 1541. 잃어버린 괄호  (0) 2020.02.11
[백준] 11054. 가장긴 바이토닉 부분수열 C++  (0) 2020.02.06
[백준] 2748 피보나치 수 2  (0) 2020.02.03
[백준] 14888 연산자 끼워넣기  (0) 2020.01.29