zeju00   2년 전

16번째 줄에 min(minn,dp[i-j*j])을 min(dp[i-1]+1,dp[i-j*j])으로 바꾸면 결과가 다르게 나오는데 이유가 뭘까요?

minn으로 제출하면 맞고 dp[i-1]+1으로 제출하면 틀리네요..

이미 14번째 줄에 minn을 dp[i-1]+1로 초기화시켜놨는데 무엇이 문제일까요?

bjh3502   2년 전

minn=min(dp[i-1]+1, dp[i-j*j])처럼 작성하게 될 경우 15라인의 for에서 최소값으로 업데이트가 되지 않습니다...

초기에 minn, dp[i-1]+1이 4라고 해봅시다.

15번라인이 두바퀴 돈다고 가정하고, dp[i-j*j]가 갖는 값이 2, 5라고 보면

첫번째 루프에서 4와 2를 비교하게 됩니다. minn에는 2가 들어가겠네요.

두번째 루프에서는 5와 4를 비교하게 됩니다. 분명, 2가 최소임에도 불구하고, dp[i-1]+1의 값은 업데이트가 되지 않으므로, 최종적으로 minn의 값은 4인채로 루프가 끝납니다.

이런식으로 업데이트를 할적에, 항상 자기 자신과 비교한다고 생각하시면 편합니다. minn이 최소를 갖도록 업데이트를 하려면, min()안에 하나는 minn이 되어야합니다.

별개로, 헷갈린다면 3개를 다 넣어버리는 것도 하나의 방법입니다.

아마 c++11부터 지원이 될텐데, minn=min({ a, b, c });같이 중괄호로 묶으면 min(a,min(b, c));에 비해서 훨씬 간결합니다.

이 경우, minn=min({dp[i-1]+1, dp[i-j*j], minn});처럼 사용하면, 앞서 말씀드린 문제에서 조금 더 안전하긴 합니다.

zeju00   2년 전

감사합니다!

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