240420 TIL #378 CT_가장 긴 증가하는 부분 수열(DP)

김춘복·2024년 4월 20일
0

TIL : Today I Learned

목록 보기
378/494

Today I Learned

오늘은 백준에서 코틀린 코테 공부!!!


가장 긴 증가하는 부분 수열

백준 11053번 https://www.acmicpc.net/problem/11053

문제

수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.
예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다.
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.
둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000)
첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다.

  • 입력
    6
    10 20 10 30 20 50
  • 출력
    4

문제 풀이

  • 수열에서 숫자들이 오름차순으로 정렬되어 있는 가장 긴 부분을 찾아야 하는 문제다. DP를 써서 문제를 간단하게 풀었다.
  1. 입력을 readln()으로 받아준다. 최대 길이를 저장하는 변수 maxLen을 초기화 한다.

  2. dp 배열을 초기값 1로 해두고 n 크기만큼 배열을 만든다.

  3. 2중 for문을 만들어 각 원소를 마지막으로 하는 증가하는 부분 수열의 길이를 계싼한다. 바깥 for문은 현재 원소를 기준으로 반복하고, 안쪽 for문은 이전 원소를 검사해 증가하는 수열의 길이를 갱신한다.

  • kotlin에서는 maxOf()가 표준 라이브러리에서 제공되는 함수다.
  1. 각 단계에서 가장 긴 증가하는 부분 수열의 길이를 업데이트 할 때 마다 최대 길이를 저장해두고 마지막에 저장된 maxLen을 출력하면 완료!

Kotlin 코드

fun main() {
    val n = readln().toInt()
    val nums = readln().split(" ").map { it.toInt() }
    var maxLen = 0
    val dp = IntArray(n) { 1 }

    for (i in 0 until n) {
        for (j in 0 until i) {
            if (nums[i] > nums[j]) {
                dp[i] = maxOf(dp[i], dp[j] + 1)
            }
        }
        maxLen = maxOf(maxLen, dp[i])
    }

    print(maxLen)
}
profile
꾸준히 성장하기 위해 매일 log를 남깁니다!

0개의 댓글