Skip to content

Conversation

@YoonYn9915
Copy link
Member

🌱WIL

이번 한 주의 소감을 작성해주세요!

  • 이번 주는 이전에 풀었었던 DP + 문자열 문제 특히 과제문제로 최소 편집 거리 알고리즘에 관련된 문제를 풀어보며 문제 유형을 복습하는데 의의가 있었다. 4달전에 풀었던게 빨리 기억은 안나서 구현 시간이 좀 오래 걸리긴 했지만, 처음과는 달리 받아쓰기 문제를 보자마자 비슷한 문제유형과 풀이방법이 떠올랐다. 조금씩 발전하고 있는 것 같다!

🚀주간 목표 문제 수: 3개

푼 문제


백준 #5582. 공통부분문자열: DP / 골드5

정리한 링크: (바로가기)

🚩제출한 코드

string1 = input()
string2 = input()

dp = [[0] * len(string1) for _ in range(len(string2))]

for i in range(len(string2)):
    for j in range(len(string1)):
        # 두 문자열의 i번째 문자와 j번째 문자가 같을때
        if string2[i] == string1[j]:
            if i > 0 and j > 0:
                dp[i][j] = dp[i-1][j-1] + 1
            else:
                dp[i][j] = 1
        else:
            dp[i][j] = 0

# dp테이블에서 최댓값 찾기
print(max(max(row) for row in dp))

백준 #20542. 받아 쓰기: DP, 문자열 / 골드 3

정리한 링크: (바로가기)

🚩플로우 (선택)

코드를 풀이할 때 적었던 플로우가 있나요?

  1. 입력 처리
    N, M 입력: 각각 문자열 inp와 answer의 길이를 나타냅니다.
    두 문자열 inp와 answer 입력:

  2. DP 테이블 초기화
    크기가 (N+1) x (M+1)인 2차원 DP 테이블 생성:

  3. DP 테이블 값 채우기

    1. 초기값 설정 (빈 문자열 비교 처리)
      i == 0: inp가 빈 문자열인 경우, answer의 첫 j개 문자를 만들기 위해 삽입 연산만 필요합니다.
      j == 0: answer가 빈 문자열인 경우, inp의 첫 i개 문자를 삭제 연산으로 비워야 합니다.
    2. 문자열 비교 및 최소 편집 거리 계산
      inp[i-1]와 answer[j-1]를 비교:
      문자가 같은 경우: 대각선(dp[i-1][j-1]) 값을 그대로 가져옵니다.
      inp[i-1] == 'i'일 때 answer[j-1]가 'l' 또는 'j'라면 대각선 값을 그대로 사용합니다.
      inp[i-1] == 'v'일 때 answer[j-1]가 'w'라면 대각선 값을 그대로 사용합니다.
      일반적인 다른 경우: 삽입, 삭제, 교체 중 최소 연산을 선택한 후 +1을 더합니다.
  4. 최종 결과 출력
    DP 테이블의 최우하단 값 dp[N][M]이 inp와 answer 간의 최소 편집 거리를 나타냅니다.

🚩제출한 코드

N, M = map(int, input().split())
inp = input()
answer = input()

dp = [[0] * (M + 1) for _ in range(N + 1)]

for i in range(N + 1):
    for j in range(M + 1):

        if i == 0 or j == 0:
            if i == 0 and j == 0:
                continue
            # 빈 문자열에서 정답 문자열을 만드는 최소 편집 거리
            if i == 0 and j != 0:
                dp[i][j] = dp[i][j - 1] + 1
            # 빈 문자열에서 답안 문자열을 만드는 최소 편집 거리
            if i != 0 and j == 0:
                dp[i][j] = dp[i - 1][j] + 1
        else:
            # 비교 문자가 같은지 아닌지 판단
            if inp[i-1] == answer[j-1]:
                # 같으면 좌상단 대각선 값을 그대로 가져옴
                dp[i][j] = dp[i - 1][j - 1]
            else:
                # 비교 문자가 달라도 i나 v를 휘갈겨 쓴 경우
                if inp[i-1] == 'i':
                    if answer[j-1] == 'l' or answer[j-1] == 'j':
                        dp[i][j] = dp[i - 1][j - 1]
                        continue
                elif inp[i-1] == 'v':
                    if answer[j-1] == 'w':
                        dp[i][j] = dp[i - 1][j - 1]
                        continue
                        
                # 비교문자가 다른 경우 위, 좌측, 좌상단 대각선 값 중 최소값을 선택한 후 1을 더해준다. 
                dp[i][j] = min(dp[i - 1][j], dp[i - 1][j - 1], dp[i][j - 1]) + 1

print(dp[N][M])

백준 #1522. 문자열 교환: 구현, 문자열 / 실버 1

정리한 링크: (바로가기)

🚩제출한 코드

def countB(str):
    cnt = 0
    for char in str:
        if char == 'b':
            cnt += 1

    return cnt


str = input()
cnt = 0

# 답 저장 변수
ans = int(1e9)

for char in str:
    if char == 'a':
        cnt += 1


# a의 개수만큼 문자열 순회하면서 윈도우 안의 b가 몇개인지 확인
for i in range(len(str)):
    # 원형을 고려하여 i + cnt 문자열의 길이를 넘어가면 앞에서 가져옴
    if i + cnt > len(str):
        tmp = str[i:]
        tmp2 = str[0: (i + cnt)-len(str)]
        b_cnt = countB(tmp + tmp2)
    else:
        tmp = str[i:i + cnt]
        b_cnt = countB(tmp)
    ans = min(ans, b_cnt)

print(ans)

  

Copy link
Collaborator

@Mingguriguri Mingguriguri left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이번 DP+문자열 문제는 새롭기도 하고 오랜만에 재밌기도 한 문제였습니다. 준비해주셔서 감사합니다!

Copy link
Collaborator

@zaqquum zaqquum left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오랜만에 등장한 LCS 이론에 대해 다시 복습해보는 유익한 시간이었습니다.
나이스한 문제 선정 감사합니다!윤상님

@YoonYn9915 YoonYn9915 merged commit 620d696 into AlgorithmStudy-Allumbus:main Jan 20, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants