C#

C# - Longest Increasing Subsequence

Dev_Jen 2025. 7. 13. 23:56

๐Ÿ“˜ 300. Longest Increasing Subsequence

๐Ÿ”น ๋ฌธ์ œ ์„ค๋ช…

์ •์ˆ˜ ๋ฐฐ์—ด nums๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ,

๋ฐฐ์—ด์—์„œ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฐ€์žฅ ๊ธด ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜๋ผ.

  • ๋ถ€๋ถ„ ์ˆ˜์—ด(subsequence):(์—ฐ์†๋œ ๊ฐ’์ผ ํ•„์š”๋Š” ์—†์Œ)
  • ์›๋ž˜ ๋ฐฐ์—ด์—์„œ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์ผ๋ถ€ ์›์†Œ๋ฅผ ๊ฑด๋„ˆ๋›ฐ์–ด ์„ ํƒํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿ”ธ ์˜ˆ์‹œ

Input: nums = [10, 9, 2, 5, 3, 7, 101, 18]
Output: 4

์„ค๋ช…: ๊ฐ€์žฅ ๊ธด ์˜ค๋ฆ„์ฐจ์ˆœ ๋ถ€๋ถ„ ์ˆ˜์—ด์€ [2, 3, 7, 101] ์ด๋ฏ€๋กœ ๊ธธ์ด๋Š” 

๐Ÿ”น ์กฐ๊ฑด

  • 1 <= nums.length <= 2500
  • 10โด <= nums[i] <= 10โด

๐ŸŽฏ ๋ชฉํ‘œ

๐Ÿ‘‰ ๋ฐฐ์—ด์—์„œ ๊ฐ€์žฅ ๊ธธ๊ฒŒ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ์ฐพ์•„์„œ

๊ทธ ๊ธธ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์•ผ.


โœ… ์˜ˆ์‹œ 2

Input: nums = [0, 1, 0, 3, 2, 3]
Output: 4
์„ค๋ช…: [0, 1, 2, 3] ์ด ๊ฐ€์žฅ ๊ธธ๋‹ค

๐Ÿง  ํ•ต์‹ฌ ๊ฐœ๋…

์ด ๋ฌธ์ œ๋Š” ์ „ํ˜•์ ์ธ ๋™์  ๊ณ„ํš๋ฒ• (DP) ๋˜๋Š” ์ด์ง„ ํƒ์ƒ‰์„ ์ด์šฉํ•œ ์ตœ์ ํ™” ๋ฌธ์ œ์•ผ.

  • ๊ธฐ๋ณธ DP ํ’€์ด: O(n²)
  • ์ด์ง„ ํƒ์ƒ‰ ์ตœ์ ํ™”: O(n log n)
using System;

public class Program
{
    public static void Main()
    {
        int[] nums = new int[] { 10, 9, 2, 5, 3, 7, 101, 18 };

        Console.WriteLine("Input Array: " + string.Join(", ", nums));

        int result = FindLengthOfLIS(nums);

        Console.WriteLine("Longest Increasing Subsequence Length: " + result);
    }

    public static int FindLengthOfLIS(int[] nums)
    {
        int n = nums.Length;
        if (n == 0) return 0;

        int[] dp = new int[n];
        for (int i = 0; i < n; i++)
            dp[i] = 1;  // ์ตœ์†Œ ์ž๊ธฐ ์ž์‹ 

        for (int i = 1; i < n; i++)
        {
            for (int j = 0; j < i; j++)
            {
                if (nums[j] < nums[i])
                {
                    dp[i] = Math.Max(dp[i], dp[j] + 1);
                }
            }
        }

        int maxLength = 0;
        for (int i = 0; i < n; i++)
            maxLength = Math.Max(maxLength, dp[i]);

        return maxLength;
    }
}