[코테] Lis & Lcs
![[코테] Lis & Lcs](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1707116316008%2F69933178-9014-48e1-856a-d9e5a336ba79.png&w=3840&q=75)
LIS (Longest Increasing Subsequence)
어떤 수열에서 순서를 유지하며 부분 수열로서 증가하는 원소들의 최대 길이를 찾는 문제
[10, 22, 9, 33, 21, 50, 41, 60, 80]일 때, LIS는 [10, 22, 33, 50, 60, 80]
각 위치에서 현재 원소까지의 LIS를 구할 때, 이전 위치의 원소들과 비교하면서 더 큰 값의 LIS를 업데이트
n = int(input())
arr = list(map(int, input().split()))
dp = [1 for _ in range(n)]
for i in range(n):
for j in range(i): # 현재 기준 i-1까지 확인
if arr[i] > arr[j]:
dp[i] = max(dp[i], dp[j]+1)
print(max(dp))
LCS (Longest Common Subsequence)
두 개의 수열에서 공통으로 나타나는 부분 수열 중 가장 긴 것을 찾는 문제
두 수열 "ABCD" & "ACDF"일 때, 공통 부분 수열은 "ACD"
두 수열의 각 문자를 비교하면서 LCS의 길이를 저장하는 2차원 배열을 구성
현재 문자가 같으면 왼쪽 대각선 위의 값에서 1을 더한 값을, 다르면 바로 위나 왼쪽의 값 중 큰 값을 선택하여 현재 위치에 저장
배열의 오른쪽 아래 값이 최종적인 LCS의 길이
M = list(str(input()))
N = list(str(input()))
dp = [[0 for _ in range(len(N)+1)] for _ in range(len(M)+1)]
for i in range(1, len(M)+1):
for j in range(1, len(N)+1):
if M[i-1] == N[j-1]:
dp[i][j] = dp[i-1][j-1] + 1
else:
dp[i][j] = max(dp[i][j-1], dp[i-1][j])
print(dp[len(M)][len(N)])
![[코테] 그리디 문제 - 무지의 먹방 라이브](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1712215455263%2F1ac1f35a-8862-4e42-8d0c-e2bea01e04c0.png&w=3840&q=75)
![[코테] Bfs 토마토](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1709032619170%2F70056896-c857-444b-9c99-45bfcb466806.png&w=3840&q=75)
![[코테] Dfs 문제 유형 - 그래프 내에서 구분하여 카운트 하기](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1709019361383%2Fb0585d72-c808-4169-83a9-2724f312e927.png&w=3840&q=75)
![[코테] DFS vs BFS](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1708971211123%2F71f9386c-6a62-43b2-a602-4d084c24d6cf.png&w=3840&q=75)
![[코테] 여행경로](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1708971251412%2F27ce72ed-8ee7-4d13-a02f-ff4bbe50c4be.png&w=3840&q=75)