인프런 커뮤니티 질문&답변

이명운님의 프로필 이미지
이명운

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

8-U

8-U 다른풀이 질문

작성

·

129

0

안녕하세요 큰돌 선생님 강의 감사합니다..

해당 문제를 처음에 보고 dp로 풀 수 있을것 같아서 접근했는데 원하는 답이 나오지 않아 선생님 강의를 보고 다익스트라로 해결하였습니다.

근데 혹시 이 문제 dp로는 해결할 수 없을까요?

http://boj.kr/b2b9e324cd1644e7a5edb8caf23830aa

처음 dp로 해결하려던 코드입니다. 사실 예제 2번 부터 답이 틀려서 완전 틀린 코드이지만 어디가 틀렸는지 잘 모르겠습니다.

dp의 매개변수로는 y좌표, x좌표, 그리고 d라는 이전에 왔던 방향을 뜻하는 매개변수를 넣었습니다.

현재의 값이 상하좌우 어디에서 온건지에 따라 최적의 값이 달라지기에 d를 추가하였습니다.

dp배열의 초기값은 -1로 초기화했고, 또한 방문여부를 해결하기 위해서 visited배열을 만들어 해결하였습니다.

답변 1

1

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 명운님 ㅎㅎ

사실 DP로 최단거리를 푼다...

라고 봤을 때 유사한 방법 중 하나는 플로이드워셜을 들 수 있습니다.

근데 이것또한 메모이제이션을 적용한다기 보다는 완화시킬 수 있는 정점들을 다시 한번 완화를 시켜서 최단거리를 만들거든요...

그러한 완화가 이 코드에는 없기 때문에 틀리지 않았나 싶습니다.

좀 더 자세히 설명하자면요.

 

플루이드워셜같은 경우 모든 간선들을 다시한번 완화가 될 가능성이 있는지를 보고 더 완화를 합니다.

하지만 이 DP의 코드 경우.

예제2를 예로 들면

3 -> 7 -> 2 -> 0 -> 1 

까지의 간선을 만들면 더이상 완화를 하지 않습니다. 그다음에는 그저 메모이제이션이 일어나겠죠.

 

하지만 정답은

그 다음. 완화를 해야 하는

3 7 2 0 1
2 8 0 9 1
1 2 1 8 1

3, 2, 1, 2, 1, 0, 2, 0, 1, 1, 1

이후..

0 5

-> 19

이라는 간선인데요.

이게 반례가됩니다.

 

명운님이 만드신 DP의 점화식은 이것입니다.

dp[i][j][d] = min( i, j 이후의 4방향으로 부터의 거리)

근데 여기서 드는 의문은

dp[i][j] = min(i, j 이후의 4방향으로부터의 거리)

가 맞지 않나라는 생각과

이렇게 했을 때 이후에 만약 다시한번 어떠한 간선을 기반으로 저 정점을 완화시킬 때 정점자체가 이미 메모이제이션이 걸려있어서 완화 가 안 될 것같습니다.

예를 들어

1 -> 2 -> 3 -> 4

-> 5

에서 DP로 하게 되면 3에는 최소거리가 담겨있겠지만

예를 들어

2 -> 6 -> 7 -> 3 이라는 간선이 있고 이게 최적해라면

그 때 3정점까지 드갔을 때 이미 계산된 3이라는 값이 있기 때문에 메모이제이션으로 return ret 이 될것이고 완화가 안 될 것 같습니다.

감사합니다.

이명운님의 프로필 이미지
이명운
질문자

아하.. 완탐으로 풀 수 있을것 같긴한데 시간초과때문에 메모이제이션만 잘 하면 되지 않을까 하고 dp로 접근했는데 완화를 시키지 못하는 코드이군요.. 답변 정말 감사합니다!

이명운님의 프로필 이미지
이명운

작성한 질문수

질문하기