🔎문제

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

 

2352번: 반도체 설계

첫째 줄에 정수 n(1 ≤ n ≤ 40,000)이 주어진다. 다음 줄에는 차례로 1번 포트와 연결되어야 하는 포트 번호, 2번 포트와 연결되어야 하는 포트 번호, …, n번 포트와 연결되어야 하는 포트 번호가 주

www.acmicpc.net

 

💡풀이

LIS(가장 긴 증가하는 부분 수열) 문제이다. (백준에 시리즈로 있는 LIS 문제들은 따로 정리해놓은것이 있으니 참고하세요😊)

 

지정된 포트들을 연결하면서, 가장 많이 연결하면 된다.

뒷쪽 포트가 앞보다 더 앞 포트를 연결하면 안되므로, 뒤로 갈수록 큰 숫자의 포트를 연결해야한다.

따라서 증가하는 수열을 구하면 되는 것이고, 가장 긴 것을 구하는것이므로 LIS문제와 똑같다.

 

📃소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;


public class Main {

    public static int n;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine());
        int[] nums = new int[n];
        for (int i = 0; i < n; i++) {
            nums[i] = Integer.parseInt(st.nextToken());
        }

        int[] memo = new int[n];
        int size = 0;
        for (int i = 0; i < n; i++) {
            int idx = Arrays.binarySearch(memo, 0, size, nums[i]);
            if (idx < 0) idx = idx * (-1) -1;
            memo[idx] = nums[i];
            if (idx == size) size++;
        }

        System.out.println(size);
    }
}