본문으로 바로가기

baekjoon. LCS

category Algorithm/문제 2021. 1. 26. 14:43

문제

풀이

dp는 나름 익숙해져 간다고 생각하면서 맞딱들인 문제..

이때까지 맛보기식 dp만 풀어놓고 자신감을 늘려가고 있다는걸 깨달았다

친구가 기본적으로 dp는 2차원 배열로 푼다고 하길래 한참 멀었다는 생각을 하게 되었다

문자를 하나씩 늘려가면서 dp배열을 채워나가면서 풀면된다

간단하게 설명하자면

ACAYKP/
CAPCAK
AACACAACAYACAYKACAYKP
C011111

A와 C를 비교 하면 LCS는 0이라 0을, AC의 'C'와 C는 1을 채워주고 비교할 문자열이 C하나이기 때문에 그 뒤도 전부 1로 채운다

ACAYKP/
CAPCAK
AACACAACAYACAYKACAYKP
C011111
CA112222

문제는 여기서부터인데 AC'A'와 C'A'가 겹친다 그럼 우리는 카운트를 늘려주어야하는데 AC와 CA에서 1을 더해서 2를 적어주는 것이 아니다

윗줄에서 AC와 C의 비교값에서 +1을 해주어야한다 그것이 dp니까.

그렇게 배열을 채워나가다 보면

ACAYKP/
CAPCAK
AACACAACAYACAYKACAYKP
C011111
CA112222
CAP112223
CAPC122223
CAPCA123333
CAPCAK123344

이런 2차원 배열이 완성된다

실제로 2차원 배열에선 점화를 위한 0으로 초기화된 배열이 가로세로 한줄씩필요하기때문에 7x7의 배열을 생성해줘야한다

코드

    const input =`ACAYKP
CAPCAK`.split('\n');
  // const input = require("fs").readFileSync("/dev/stdin").toString().trim().split('\n');
  const cache = Array(input[0].length+1).fill(0).map(()=>Array(input[1].length+1).fill().map(()=>0));

  for(let i=0; i<input[0].length;i++){
      for (let j=0; j<input[1].length;j++) {
          if (input[0][i] === input[1][j]) cache[i+1][j+1] = cache[i][j]+1;
          else cache[i+1][j+1] = Math.max(cache[i+1][j],cache[i][j+1]);
      }
  }

  console.log(cache[input[0].length][input[1].length]);

'Algorithm > 문제' 카테고리의 다른 글

baekjoon. 주유소  (0) 2021.01.29
baekjoon. 평범한 배낭  (0) 2021.01.27
leetcode. Reverse Integer  (0) 2021.01.19
leetcode. ZigZag Conversion  (0) 2021.01.18
leetcode. Longest Substring Without Repeating Characters  (0) 2021.01.16