https://www.acmicpc.net/problem/9251
해결방법
2차원 배열의 캐시값을 만들어 해결했다.
- 백준 사이트의 [예제 입력 1]
A C A Y K P
[0, 0, 0, 0, 0, 0, 0]
C [0, 0, 1, 1, 1, 1, 1]
A [0, 1, 1, 2, 2, 2, 2]
P [0, 1, 1, 2, 2, 2, 3]
C [0, 1, 2, 2, 2, 2, 3]
A [0, 1, 2, 3, 3, 3, 3]
K [0, 1, 2, 3, 3, 4, 4]
- 백준 사이트 질문글에 있는 반례
A C A A
[0, 0, 0, 0, 0]
A [0, 1, 1, 1, 1]
A [0, 1, 1, 2, 2]
A [0, 1, 1, 2, 3]
C [0, 1, 2, 2, 3]
B [0, 1, 2, 2, 3]
A [0, 1, 2, 3, 3]
여기를 누르면 해당 질문글로 이동합니다.
풀이👀
1. 두 문자열을 순회한다.
2-1. 일치하는 문자이면, 왼쪽 대각선 위의 수+1을 한 값을 지금 위치에 저장한다.
2-2. 일치하는 문자가 아니면, 바로 왼쪽과 바로 위쪽 숫자 중 더 큰 값을 지금 위치에 저장한다.
아래 더보기를 누르면 예제입력1을 풀이하는 순서를 간략하게 볼 수 있습니다. (사지방이라 이게 최선입니다 ㅠ)
더보기
1
A C A Y K P
[0, 0, 0, 0, 0, 0, 0]
C [0, 0, 1, 1, 1, 1, 1]
A [0, 0, 0, 0, 0, 0, 0]
P [0, 0, 0, 0, 0, 0, 0]
C [0, 0, 0, 0, 0, 0, 0]
A [0, 0, 0, 0, 0, 0, 0]
K [0, 0, 0, 0, 0, 0, 0]
==============
2
A C A Y K P
[0, 0, 0, 0, 0, 0, 0]
C [0, 0, 1, 1, 1, 1, 1]
A [0, 1, 1, 2, 2, 2, 2]
P [0, 0, 0, 0, 0, 0, 0]
C [0, 0, 0, 0, 0, 0, 0]
A [0, 0, 0, 0, 0, 0, 0]
K [0, 0, 0, 0, 0, 0, 0]
==============
3
A C A Y K P
[0, 0, 0, 0, 0, 0, 0]
C [0, 0, 1, 1, 1, 1, 1]
A [0, 1, 1, 2, 2, 2, 2]
P [0, 1, 1, 2, 2, 2, 3]
C [0, 0, 0, 0, 0, 0, 0]
A [0, 0, 0, 0, 0, 0, 0]
K [0, 0, 0, 0, 0, 0, 0]
==============
4
A C A Y K P
[0, 0, 0, 0, 0, 0, 0]
C [0, 0, 1, 1, 1, 1, 1]
A [0, 1, 1, 2, 2, 2, 2]
P [0, 1, 1, 2, 2, 2, 3]
C [0, 1, 2, 2, 2, 2, 3]
A [0, 0, 0, 0, 0, 0, 0]
K [0, 0, 0, 0, 0, 0, 0]
==============
5
A C A Y K P
[0, 0, 0, 0, 0, 0, 0]
C [0, 0, 1, 1, 1, 1, 1]
A [0, 1, 1, 2, 2, 2, 2]
P [0, 1, 1, 2, 2, 2, 3]
C [0, 1, 2, 2, 2, 2, 3]
A [0, 1, 2, 3, 3, 3, 3]
K [0, 0, 0, 0, 0, 0, 0]
==============
6
A C A Y K P
[0, 0, 0, 0, 0, 0, 0]
C [0, 0, 1, 1, 1, 1, 1]
A [0, 1, 1, 2, 2, 2, 2]
P [0, 1, 1, 2, 2, 2, 3]
C [0, 1, 2, 2, 2, 2, 3]
A [0, 1, 2, 3, 3, 3, 3]
K [0, 1, 2, 3, 3, 4, 4]
코드🐱👓
A = input()
B = input()
arr = [ [0 for i in range(len(A)+1)] for j in range(len(B)+1) ]
ans = 0
for i in range(1, len(B)+1):
al = B[i-1]
for j in range(1, len(A)+1):
if al == A[j-1]:
arr[i][j] = arr[i-1][j-1] + 1
arr[i][j] = max(arr[i][j], arr[i][j-1], arr[i-1][j])
ans = max(arr[i][j], ans)
print(ans)
코드 설명
arr[i][j] = max(arr[i][j], arr[i][j-1], arr[i-1][j])
12번째 줄에 코드이다.
10,11 줄에 if문을 통해서 arr[i][j]의 최신화를 시켜주었다. 그러므로 결국 12번째 줄은 문자가 일치하지 않는 경우 arr[i][j]의 값을 업데이트해주기 위해 만들어두었다.
(사지방은 캡쳐해도 편집이 안 되네요..)
'문제 풀이 > 백준' 카테고리의 다른 글
[G5] 백준 15486 - 퇴사 2 (Python3) (4) | 2023.11.19 |
---|---|
[S3] 백준 2579 - 계단 오르기 (Python3) (0) | 2023.10.30 |
[G5] 백준 5582 - 공통 부분 문자열 (python3) (0) | 2023.08.19 |
[G4] 백준 1253 - 좋다 (python3) (0) | 2023.07.14 |
[G4] 백준 1753 - 최단경로 (Python3) (0) | 2023.02.20 |
댓글