ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • BOJ 2352 반도체 설계
    Algorithm/BOJ 2020. 6. 12. 16:10
    728x90

    출처: www.acmicpc.net/problem/2352

    분류: Greedy, LIS


    접근방식

    포트에 선이 서로 꼬이지 않게 연결하려고 할 때 가장 많이 연결할 수 있는 개수를 찾는 문제입니다.

    문제의 예처럼 이렇게 연결되어 있을 때, 왼쪽을 A포트 오른쪽을 B포트라고 생각해보겠습니다.

    A[1] -- B[4] 포트가 연결되어 있다면

    왼쪽에서 A[1]을 제외한 나머지 포트들은 모두 1보다 크기 때문에 

    B에서 4보다 작은 포트들에는 연결할 수가 없습니다.

     

    다시말해 A[i] 포트 --> B[j] 포트로 연결하려고 할 때 현재까지 B에 연결되어있는 포트 중 가장 큰 녀석보다 작은 경우에는 연결할 수가 없게 됩니다.

    즉, 이 경우엔 B에 연결해야 하는 포트들 중에서 연속적으로 증가하는 수의 최대 길이가 몇이야? 라고 묻는 것과 같습니다.

    == LIS(Longest Increase Sequence) 최장 증가 수열을 찾는 문제입니다.

     

    해결방법

    최장 문제 수열로 풀었습니당

    let n = Int(readLine()!)!
    let ports = readLine()!.split(separator: " ").map{Int(String($0))!}
    
    // O(logN)
    func binSearchLower(array arr: [Int], target: Int) -> Int {
        var low = 0
        var high = arr.count
        var mid = 0
        
        while low < high {
            mid = (low + high)/2
            
            if target <= arr[mid] {
                high = mid
            } else {
                low = mid+1
            }
        }
        return low < arr.count ? low : arr.count-1
    }
    
    // Longest Incresing sequence
    // O(N)
    func findLIS(array ports: [Int]) -> Int {
        var arr = [Int]()
        for port in ports {
            // minIncreses의 마지막 값보다 크면 푸시, 아니면 위치를 찾아서 바꿔준다.
            if arr.isEmpty || port > arr.last! {
                arr.append(port)
            } else {
                let index = binSearchLower(array: arr, target: port)
                arr[index] = port
                //print(port, index, arr)
            }
        }
        
        return arr.count
    }
    
    func main() {
        // O(nlogN)
        let lis = findLIS(array: ports)
        print(lis)
    }
    
    main()

     

    배운점

    그리디는 풀다보면 정말 여러 개념이 복합적으로 들어가는 것 같습니다.

    이번 문제를 풀기 위해 LIS, 이진탐색, 이진탐색 Lower bound를 공부했네요

    문제고 그냥 슥슥 쉽게 풀면 좋겠지만...

    아쉽게도 전 그런 천재가 아니니 여러 이론을 많이 정확하게 이해하면서 해나가는 과정이 필요하겠습니다.
    (모르면 못풀겠어요 😥😭😇)

    갈 길이 멀군요..

    화이팅 

     

    'Algorithm > BOJ' 카테고리의 다른 글

    BOJ 백준 1449 수리공 항승  (0) 2020.06.13
    백준 2437 저울  (0) 2020.06.13
    BOJ1080 행렬  (0) 2020.06.11
    백준 1049 기타줄  (0) 2020.06.08
    백준 1946 신입 사원  (2) 2020.06.08

    댓글

Designed by Tistory.