https://leetcode.com/problems/longest-common-subsequence/description/
Just a moment...Just a moment...leetcode.com이 문제를 풀었음.
"abcde" , "ace"가 있을 때 가장 긴 common subseq가 "ace" 라서 길이 3을 찾는 문제.
처음에 좀 헤메다가, dp문제라는 걸 알고 있긴 해서 2차원 dp로 풀었음.
내가 푼 방법은
이런식으로 행과 열에서 각 알파벳 값이, 해당 값까지만 문자열에서 사용한다고는 표기일 때,
빨간색 동그라미의 경우, "a"와 "a"를 비교하는데 값에 해당하는 두 알파벳이 같으니까, 값으로 1을 채울 수 있음.
두번째 동그라미인 경우, "c"와 "c"가 같은 상황이기 때문에, 대각선 위의 값 "ab"와 "a"를 비교했을 때 가장 길었던 subseq에서 1을 더한 2가 나옴.
이렇게 하기 위서는 첫번째 동그라미에서도 "a"와 "a"가 같은 상황에서 대각선 위의 " ", " " 를 비교한 0에서 1을 더했다고 볼 수 있음.
마름모의 경우에는 "abc"와 "ace"를 비교하는데, 이 때도 "c"와 "e"가 다르기 때문에,
"abc"와 "ac"를 비교하는 문제, "ab"와 "ace"를 비교하는 문제의 sub-problem으로 나뉘고 이 중에 더 큰 값을 가져옴.
이걸 반복하다보면 결국엔 마지막 칸을 채울 수 있고 이 값을 가져오면 답은 3을 가져오게 됨.
내가 유튜브에서 본 풀이는 이거였음. 여기서는 행과 열에서의 각 알파벳 값이, 해당 값부터 문자열에서 사용한다는 표기임.
p1에서 출발한다고 가정했을 때, 이 때는 "a"와 "a"가 같으니까 "bcde"와 "ce"를 비교하는 subproblem으로 가기 위해 대각선으로 이동함.
그래서 s2에 도달하면 s2는 "b"와 "c"가 다르기 때문에 2개의 subproblem으로 나눠질 수 있음.
첫번째는 오른쪽으로 이동해서 "cde"와 "ce"를 비교하는 문제, 두번째는 아래로 이동해서 "e"와 "bcde"를 비교하는 문제 중 더 큰 값을 구해서 s2에 채워줌.
이런 식으로 쭉쭉 내려가다보면 결국엔 "e", "e"가 만나는 칸에 도착하게 되는데, 이 때는 답이 1임을 알 수 있음.
이렇게 "e", "e"가 만나는 칸부터 1로 채우고 뒤로 돌아가면서 푸는 방식을 봣음.
일반적으로 1번을 bottom-up이라 하고 2번을 top-down이라고 부릅니다 처음 이해할 때에는 top-down이 dp의 개념을 이해하는데에는 더 쉽다고 생각해요! 하지만 bottom-up이 더 구현이 간결해서 보통 bottom-up으로 넘어가게 됩니다 물론 트리dp 등등 top-down 구현을 강제하는 경우들이 있어서 결국 둘다 익숙해지시는게 제일 좋습니다
음.. 고민해봤는데 둘다 bottom-up top-down 모두 구현 가능한것같네요.. 애초에 bottom-up과 top-down은 어떻게 코드를 짜냐의 방식의 문제라서 애초에 다른 얘기인것 같습니다
굳이 얘기하면 2번 처럼 e라는 top에 간 다음 처음으로 돌아가서 topdown 인건가 싶네요. 여하튼 둘다 익혀놔야겠네요ㅇㅇ
오 고맙당