[백준] 11053번: 가장 긴 증가하는 부분 수열 (JavaScript)

2025. 2. 21. 13:32·PS

 

 

 


 

문제

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

 

개념

동적 계획법(DP)

 

 

 

구현 코드(JavaScript)

const fs = require('fs');

// 백준 제출용
let input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');

// 로컬 테스트용
// const filePath =
//   process.platform === 'linux' ? '/dev/stdin' : __dirname + '/input.txt';
// const input = fs.readFileSync(filePath).toString().trim().split('\n');

const n = Number(input[0]);
const arr = input[1].split(' ').map(Number);

let dp = new Array(n).fill(1);

for (let i = 0; i < n; i++) {
  for (let j = 0; j < i; j++) {
    if (arr[i] > arr[j]) dp[i] = Math.max(dp[i], dp[j] + 1);
  }
}

console.log(Math.max(...dp));

 

 

 

 

코드 설명

다이나믹 프로그래밍을 이용해서 풀 수 있는 대표적인 문제입니다.

 

먼저, dp 배열을 n의 크기만큼 설정하고 원소값을 1로 초기화 합니다.

 

이중반복문을 통해 이전 값과 다음 값을 비교할 수 있도록 설정한다면

다음과 같은 dp 점화식을 세울 수 있습니다.

    if (arr[i] > arr[j]) dp[i] = Math.max(dp[i], dp[j] + 1);

 

만약 비교하려는 두 수 중 어느 값이 더 크다면, 즉 증가하는 부분 수열(=LIS)이라면

dp[i]는 i번째 원소를 마지막으로 하는 현재 최장 증가 부분 수열의 길이라고 정의합니다. 

dp[i]는 0~i-1번째 원소 중 값은 arr[i]보다 작지만 현재 LIS 길이에 1을 더해줍니다.

 

해당 로직을 통해 현재 최장 증가 부분 수열이 크다면 해당 LIS의 길이를 그대로 유지하고,

아니라면 dp[j] + 1으로 현재 최대 길이에 1을 더해 LIS를 갱신할 수 있습니다.

 

문제에서 주어진 예제 입력은 다음과 같습니다.

6
10 20 10 30 20 50

 

이들을 해당 로직에 적용한 결과는 다음과 같습니다.

 

 

마지막 dp 배열에 결과에 주목해보면 증가하는 부분의 경우 +1로 갱신하는 모습을 볼 수 있습니다.

 

 


 

저작자표시 비영리 동일조건 (새창열림)

'PS' 카테고리의 다른 글

[백준] 1213번: 팰린드롬 만들기 (JavaScript)  (0) 2025.02.22
[백준] 7576번: 토마토 (JavaScript)  (0) 2025.02.22
[백준] 1062번: 연결 요수의 개수 (JavaScript)  (0) 2025.02.20
[백준] 13904번: 과제 (JavaScript)  (0) 2025.02.20
[백준] 11659번: 구간 합 구하기 4 (JavaScript)  (0) 2025.02.19
'PS' 카테고리의 다른 글
  • [백준] 1213번: 팰린드롬 만들기 (JavaScript)
  • [백준] 7576번: 토마토 (JavaScript)
  • [백준] 1062번: 연결 요수의 개수 (JavaScript)
  • [백준] 13904번: 과제 (JavaScript)
abyss-s
abyss-s
프론트엔드 개발합니다!
  • abyss-s
    abyss-s의 블로그입니다.
    abyss-s
  • 전체
    오늘
    어제
    • 분류 전체보기 (189) N
      • Web (16)
        • JavaScript (6)
        • TypeScript (1)
        • React (5)
        • Vue (0)
        • Storybook (1)
        • Next.js (1)
      • Backend & Infra (8)
        • Database (3)
        • Node.js (2)
        • SpringBoot (1)
      • PS (71)
      • CS (30)
        • OS (13)
        • Structure & Algorithm (5)
        • Network (10)
        • 정보처리기사 (2)
      • Language (18)
        • OOP (1)
        • JAVA (13)
        • C++ (4)
      • Activities (13) N
        • 멋쟁이 사자처럼 (2)
        • OSSCA (3)
        • LG U+ URECA (4) N
        • Project (2)
      • AI (0)
      • Git & Github (5)
      • Notion (1)
      • IT (4)
      • Statistics (11)
      • Book (4)
      • Diary (1)
      • Game (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
    • 백준
    • 트위터
  • 공지사항

    • abyss-s의 티스토리에 오신 것을 환영합니다.
  • 인기 글

  • 태그

    Python
    통계학
    Java
    자바스크립트
    코드트리
    BFS
    C++
    JavaScript
    백준
    자바기반응용프로그래밍
    OS
    github
    네트워크
    운영체제
    생활코딩
    DP
    BAEKJOON
    React
    그리디
    파이썬
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
abyss-s
[백준] 11053번: 가장 긴 증가하는 부분 수열 (JavaScript)
상단으로

티스토리툴바