윤굥굥
yg323
윤굥굥
전체 방문자
오늘
어제
  • 굥굥 DEV
    • Computer Science
      • 자료구조 및 알고리즘
      • 운영체제
      • 네트워크
      • 데이터베이스
    • Programming Language
      • Java
      • Kotlin
    • Android
      • with Kotlin
    • Algorithm
      • with Kotlin
    • 하나씩 습득하는 중

블로그 메뉴

  • ↓백준 모아보기 ↓
  • 💚 플레티넘 문제 모아보기
  • 💛 골드 문제 모아보기
  • 🤍 실버 문제 모아보기
  • 🤎 브론즈 문제 모아보기

공지사항

인기 글

최근 댓글

최근 글

hELLO · Designed By 정상우.
윤굥굥

yg323

Algorithm/with Kotlin

[백준][코틀린] 11053 가장 긴 증가하는 부분 수열

2022. 2. 23. 14:29

문제 내용

문제

수열 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가 가장 느린(?) 방법이다. 시간 복잡도가 O(\(n^2\))이 나오기 때문! 

일단, dp 배열을 1로 초기화 해준다. dp 배열에는 해당 인덱스까지 최소 길이이다. 따라서, 값 하나라도 길이는 1이기 때문에 1로 초기화 해준다.

그러고나서 값을 찾을건데, 2중 포문을 돌면서

if (array[j] < array[i]) dp[i] = maxOf(dp[i], dp[j]+1)

를 만족할 때 dp의 값을 갱신해줄 것이다.

</>̆̈ 코드

import java.util.*

fun main() {
    val br = System.`in`.bufferedReader()
    val n = br.readLine().toInt()
    val dp = IntArray(n) {1}
    val array = StringTokenizer(br.readLine()).run { IntArray(n) {nextToken().toInt()} }

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

    print(dp.maxOrNull())
}

링크

 

11053번: 가장 긴 증가하는 부분 수열

수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이

www.acmicpc.net

 

저작자표시 비영리 변경금지 (새창열림)
    'Algorithm/with Kotlin' 카테고리의 다른 글
    • [백준][코틀린] 2805 나무 자르기
    • [백준][코틀린] 11054 가장 긴 바이토닉 부분 수열
    • [백준][코틀린] 2579 계단 오르기
    • [백준][코틀린] 10844 쉬운 계단 수
    윤굥굥
    윤굥굥

    티스토리툴바