chlwlsgur000   1년 전

dp에서 index를 얻은 다음 그 index를 numbers에 이용하여 

6
10 20 10 30 20 50

4
10 20 30 50

로 결과를 내고싶은데

System.out.println(numbers[ Arrays.binarySearch(dp, 4)]);   =  50   // 정상 출력 됨

System.out.println(numbers[ Arrays.binarySearch(dp, 3)]);   = -6 // 30을 기대했으나 -6이 출력이 되어 numbers배열에서 오류가 남

System.out.println(numbers[ Arrays.binarySearch(dp, 2)]);  = 20 // 정상 출력 됨

System.out.println(numbers[ Arrays.binarySearch(dp, 1)]);  =10 // 정상 출력 됨.

3을 제외하고 나머지 4,2,1은 정상출력이 되는데 왜 3만 안될까요.??

byeongkeunahn   1년 전

DP[i] = (i번째 위치에서 끝나는 부분수열 중 가장 긴 LIS 길이)인 것 같습니다. 예제 입력에 대해서는 DP[i] = {1, 2, 1, 3, 2, 4}입니다. DP[i]가 단조증가가 아니기 때문에 이분탐색을 사용할 수 없습니다. DP 값 역추적이 필요합니다. DP[i]가 최대인 i를 아무거나 찾고, 그 DP[i] 값을 준 j<i를 찾고, 이렇게 되짚어나가는 과정이 필요합니다. 구현은 두 가지로 가능합니다. 하나는 앞서 설명한 것처럼 i를 찾고 j<i를 찾기를 반복하면서 다시 계산해보는 방식이고, 다른 하나는 DP표를 채울 때 argmax를 저장해놓는 것입니다.

chlwlsgur000   1년 전

네. 댓글 감사합니다! 다시 역추적으로 문제를 풀어서 맞추긴 했는데 왜

System.out.println(numbers[ Arrays.binarySearch(dp, 3)]); 

이 라인만 비정상적인 출력이 나오는지 궁금했습니다!

byeongkeunahn   1년 전

Java documentation을 보면 정확히 그 값이 존재하지 않는 경우 그 값보다 큰 최초의 위치를 j라고 할 때 -j-1이 반환되는 것으로 되어 있습니다.

chlwlsgur000   1년 전

네! 계속 댓글로 여쭤봐서 정말 죄송한데, 제가 구글링으로 binarySearch에 공부하고 왔는데

저 코드를 실행 해보면 dp배열이 { 1, 2, 1, 3, 2, 4} 이 나옵니다.

그래서 저는 당연히 dp배열에 요소값으로 3이 있으니

Arrays.binarySearch(dp, 3) 는 3이 나올 줄 알았는데 byeongkeunahn님 말씀대로 -6이 나오네요...

정말 컴퓨터 세계는 알다가도 모르는거 같습니다 ㅋㅋㅋㅋ

좀 더 공부해보겠습니다! 늦은 시간에 감사합니다!

chlwlsgur000   1년 전

아마 제생각에 dp배열이 정렬되지 않은 체 binarySearch를 사용하여 그런거같습니다!

byeongkeunahn   1년 전

네네 binarySearch에 정렬되지 않은 배열을 줘서 오작동하는 게 맞습니다.

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