wjdckfrl55   2년 전

안녕하세요. 코드 작성 과정에서 잘못된 점이 확인이 돼서 정상적으로 수정을 했고 정답처리를 받기는 하였지만 궁금점이 남아있어서 질문 드립니다.


저는 이 문제를 2차원 테이블을 만들어서 값들을 모두 채워나가는 방식으로 해결하려 했었습니다.


테이블은 예제입력인

ACAYKP

CAPCAK

를 예시로 들면

-   A  C  A  Y  K  P  -

C  4  3  2  1  1  1  0

A  4  3  2  1  1  1  0

P  3  3  2  1  1  1  0

C  3  3  2  1  1  0  0

A  2  2  2  1  1  0  0

K  1  1  1  1  1  0  0

-   0  0  0  0  0  0  0

이런 식으로 만들어서 각 인덱스가 입력받은 문자열의 위치를 나타낼 때, 그 지점을 포함하여 그 이후의 문자들 만을 나타내는 두 문자열들의 LCS 를 저장하는 방식이었습니다. 예를들어 위 테이블의 볼트,밑줄 처진 3이라는 수가 의미하는 것은 CAYKP 와 CAK 의 LCS 인 셈입니다.

테이블이 정상적으로 완성되기만 하면 맨 왼쪽 위 숫자가 정답이 되는 방식이었는데, 문제는 테이블을 만드는 방식이었습니다.

테이블을 채워나가는 중 ACAYKP 와 APCAK 의 LCS를 알아내야 하는 순간이 왔다면  두 문자열의 첫 문자들이 서로 완전히 같으므로 무조건 첫번째 문자들을 사용한다고 가정하고 첫 문자들을 제외한 CAYKP 와 PCAK 의 LCS 에 1을 더하므로서 구하고자 하는 수를 구할 수 있다고 생각했었습니다. 그런데 코드를 작성하는 도중 뭐에 홀렸는지  

CAYKP 와 PCAK 의 LCS 에 1을 더하는 것이 아닌 

ACAYKP 와 PCAK 의 LCS  

CAYKP 와 APCAK 의 LCS 

중 작은것에 1을 더하는 방식으로 작성해 버렸습니다.


물론 제출하자마자 틀렸습니가 떳는데, 아무리 찾아봐도 반례를 찾을 수가 없었습니다.
질문글에서 an0520a 님이 올려주신 입출력 예시들도 모두 다 옳게 나왔고, 이제는 위 두가지 방법이 표현이 다를 뿐 에초에 서로 같은 방법이 아닌가 하는 생각도 드네요..

두 방법이 왜 다른지에 대한 설명이나 반례를 찾아주실 수 있을까요?

amphet   2년 전

ABAA  / AABB

댓글을 작성하려면 로그인해야 합니다.