백준(G5) 9251번: LCS(파이썬,Python3)

2023. 1. 18. 15:00·Python/백준 문제풀이
반응형

나는 이 문제를 DP 알고리즘 중 Tabulation(상향식)을 이용해서 풀었다.

DP에 대해 간단히 설명을 하자면 Tablulation(상향식)과 Memoization(하향식)이 있다.

 

Tabulation은 우리가 흔히 아는 DP 알고리즘이다.

중복된 값은 계산하지 않으며 이전에 계산한 값을 바탕으로 새로운 값을 계산한다.

피보나치수열을 예시로 들 수 있다.

f[i] = f [i-1] + f [i-2]에서 볼 수 있듯이 이전에 계산한 값을 바탕으로 새로운 값을 계산하는 방법이다.

 

Memoization은 결과값에 접근하려는 시도를 하고, 해당 값에 가까운 값을 DP에서 찾아나가며 탑 다운의 형태로 중복된 값을 사용하거나 메모하는 형태를 띤다. 

 

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

 

9251번: LCS

LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.

www.acmicpc.net

문자열이 두개 주어지고 문자열의 최장 부분수열을 구하는 문제다.

이 문제를 보자마자 다들 이론은 쉽게 생각할 것이라고 생각한다.

이중 반복문을 사용한 다음 문자 하나와 문자열 전체를 비교하는 방식으로 문제를 풀면 된다.

그런데 DP를 접목해서 풀어야 한다.

 

코드와 함께 설명하겠다.

 

1
2
3
4
list1,list2 = input().strip(),input().strip()
 
len_list1, len_list2 = len(list1),len(list2)
table = [[0] * (len_list2 + 1) for _ in range(len_list1 + 1)]   
cs

문자열 두개를 입력받은 뒤, 변수 두 개에 문자열의 길이를 각각 넣는다.

이후 반복문을 이용해 2차원 배열을 만든다. 이때 X축과 Y축을 매우 주의해야 한다..(이것 때문에 3번 틀렸다)

 

 

1
2
3
4
5
6
for i in range(1,len_list1 + 1):
    for e in range(1,len_list2 + 1):
        if list1[i-1] == list2[e-1]:
            table[i][e] = table[i-1][e-1] + 1
        else:
            table[i][e] = max(table[i][e-1], table[i-1][e])
cs

첫 번째 문자열의 문자와 두 번째 문자열의 문자들을 비교하는 방식으로 이중 반복문을 만들었다.

이때 이전 문자를 비교해 같으면 현재 문자 값에 1을 더하고 다르면 더 큰 값을 찾는 방식으로 풀었기 때문에 for 반복문의 범위를 1부터 문자열의 길이 + 1 한 값으로 풀어야한다. 

이전 문자가 같으면 더 큰 값을 찾을 필요 없이 전 값에 1을 더하면 되고 이전 문자가 다르면 x축에서 1을 뺀 값과 y축에서 1을 뺀 값을 비교해 더 큰값을 현재값으로 설정한다.

 

정답코드:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import sys
input = sys.stdin.readline
 
list1,list2 = input().strip(),input().strip()
 
len_list1, len_list2 = len(list1),len(list2)
table = [[0] * (len_list2 + 1) for _ in range(len_list1 + 1)]   
for i in range(1,len_list1 + 1):
    for e in range(1,len_list2 + 1):
        if list1[i-1] == list2[e-1]:
            table[i][e] = table[i-1][e-1] + 1
        else:
            table[i][e] = max(table[i][e-1], table[i-1][e])
print(table[-1][-1])
 
Colored by Color Scripter
cs
반응형
'Python/백준 문제풀이' 카테고리의 다른 글
  • 백준(G4) 3078번: 좋은 친구(파이썬, Python3)
  • 백준(G3) 2252번: 줄 세우기 (파이썬, Python3) + 위상정렬
  • 백준(G3) 2812번: 크게 만들기(파이썬, Python3)
  • 백준(G4) 1744번: 수 묶기 (파이썬,Python3)
코딩하는_대학생
코딩하는_대학생
Java Developer, Open Source Enthusiast, Proud Son
  • 코딩하는_대학생
    코딩하는 대학생에서 개발자까지
    코딩하는_대학생
  • 전체
    오늘
    어제
    • 분류 전체보기 (217)
      • 코딩하는 대학생의 책 추천 (8)
        • 클린코드 (5)
        • 헤드퍼스트 디자인패턴 (3)
      • Backend (7)
        • Spring (14)
        • AWS (3)
        • 회고 (4)
        • Redis (5)
        • 다양한 시각에서 바라본 백엔드 (3)
      • Python (35)
        • 개념 및 정리 (15)
        • 백준 문제풀이 (20)
      • JAVA (17)
        • 개념 및 정리 (14)
        • 백준 문제풀이 (2)
      • 왜? (7)
      • C언어 (42)
        • 개념 및 정리 (9)
        • 백준 문제풀이 (32)
      • 개인 공부 (27)
        • 대학 수학 (5)
        • 대학 영어 (10)
        • 시계열데이터 처리 및 분석 (5)
        • 컴퓨터 네트워크 (6)
        • 운영체제 (1)
      • 솔직 리뷰 (23)
        • 꿀팁 (6)
        • IT기기 (1)
        • 국내 여행 (7)
        • 맛집 (2)
        • 알바 리뷰 (2)
      • 대외활동 (17)
        • 체리피우미 3기 (4)
        • 꿀잠이들 6기 (13)
      • 음식 평가 (1)
      • 일상 & 근황 (2)
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코딩하는_대학생
백준(G5) 9251번: LCS(파이썬,Python3)
상단으로

티스토리툴바