20200512 알고리즘

1. 최대 부분 증가수열

N개의 자연수로 이루어진 수열이 주어졌을 때, 그 중에서 가장 길게 증가하는(작은 수에서 큰 수로) 원소들의 집합을 찾는 프로그램을 작성하라. 예를 들어, 원소가 2, 7, 5, 8, 6, 4, 7, 12, 3 이면 가장 길게 증가하도록 원소들을 차례대로 뽑아내면 2, 5, 6, 7, 12를 뽑아내어 길 이가 5인 최대 부분 증가수열을 만들 수 있다.

▣ 입력설명 첫째 줄은 입력되는 데이터의 수 N(1≤N≤1,000, 자연수)를 의미하고, 둘째 줄은 N개의 입력데이터들이 주어진다.

▣ 출력설명 첫 번째 줄에 부분증가수열의 최대 길이를 출력한다.

▣ 입력예제 1

 8 
 5 3 7 8 6 2 9 4

▣ 출력예제 1

4

Solution

function solution(n, arr){
    arr.unshift(0)
    const dis = new Array(n+1).fill(0)
    dis[1] = 1
    let res = 0
    for (let i=2; i<arr.length; i++){
      let max = 0
      for (let j=i-1; j>0; j--){
        if (arr[i] > arr[j] && dis[j] > max) max = dis[j]
      }
      dis[i] = max + 1
      if (dis[i] > res) res = dis[i]
    }
    return res
  }
  console.log(solution(9, [2, 7, 5, 8, 6, 4, 7, 12, 9]))

2. 최대 선 연결하기

왼쪽의 번호와 오른쪽의 번호가 있는 그림에서 같은 번호끼리 선으로 연결하려고 합니다. 왼쪽번호는 무조건 위에서부터 차례로 1부터 N까지 오름차순으로 나열되어 있습니다. 오른쪽의 번호 정보가 위부터 아래 순서로 주어지만 서로 선이 겹치지 않고 최대 몇 개의 선 을 연결할 수 있는 지 구하는 프로그램을 작성하세요.

image

위의 그림은 오른쪽 번호 정보가 4 1 2 3 9 7 5 6 10 8 로 입력되었을 때 선이 서로 겹치지 않고 연결할 수 있는 최대 선을 개수 6을 구한 경우입니다.

▣ 입력설명 첫 줄에 자연수 N(1<=N<=100)이 주어집니다. 두 번째 줄에 1부터 N까지의 자연수 N개의 오른쪽 번호 정보가 주어집니다. 순서는 위쪽번호 부터 아래쪽번호 순으로입니다.

▣ 출력설명 첫 줄에 겹치지 않고 그을 수 있는 최대선의 개수를 출력합니다.

▣ 입력예제 1

 10
 4 1 2 3 9 7 5 6 10 8

▣ 출력예제 1

6

function solution(n, arr){
    arr.unshift(0)
    const dis = new Array(n+1).fill(0)
    dis[1] = 1
    let res = 0
    for (let i=2; i<arr.length; i++){
      let max = 0
      for (let j=i-1; j>0; j--){
        if (arr[i] > arr[j] && dis[j] > max) max = dis[j]
      }
      dis[i] = max + 1
      if (dis[i] > res) res = dis[i]
    }
    return res
  }
  console.log(solution(10, [4, 1, 2, 3, 9, 7, 5, 6, 10, 8]))

Written by@[HongDongUk]
공부한 것을 소소하게 적는 블로그.

GitHubFacebook