You’re given an array containing both positive and negative integers and required to find the subarray with the largest sum (O(N) a la KBL). Write a routine in C for the above.
한번 훓어서 가장 크기가 큰 Subarray의 인덱스를 찾아내면 될거 같다.
아래 포스팅이 너무 눈에 거슬려서 문제하나 풀어봤다.
풀어본다음에 구글 검색을 해보니 비슷한 방법으로 C++로 풀어본 사람이 있더라.
rand 함수로 음수를 제너레이트 하기 위해 꽁수 부린것… 그것 빼놓고는 비슷한거 같다.
문제 대로 C로 풀어봤다.
위의 것을 그래프로 표현을 해보면(x : 배열 인덱스, y : sum) 증가하다가 감소하는 부분까지의 합계가 가장 큰 부분을 찾으면 되겠다. 값이 크면 인덱스 업데이트, 업데이트 계속 하면서 (아니면 그대로 끝나든지 하는 부분…)
max값을 update하면서 인덱스도 동시에 저장하면서 나아가면 한번에 끝난다.
다른 좋은 방법있으면 소개시켜주길 바란다.
ps. 문제중에 “la KBL”이 무슨 말인지 잘 모르겠다.
오래된 글에 댓글 달아주셨네요. 트랙백은 스팸이 너무너무 많아진지라 막아버렸습니다. ^^
그리고 KBL이 뭔지 저도 궁금해지네요. 검색해보니 Korean Basketball League라고도 나오던데… ^^;;
Knowlegde-Based Learning 의 약자로 “지식기반 귀납학습” 이라고 하더라.. 관련문서는
http://scai.snu.ac.kr/~scai/Workshop/scai98s/A6.hwp
를 보시고~
la 는 불어로 영어의 ‘the’에 해당하는 여성형 부정관사 라네~
시간 없다더니, 우리 내일 볼 수 있는거냐?
맨날 구경만 하던 사람입니다. ^^;
문제가 조금 있는데, [5,5,-1,5,5] 같은 경우 -1 을 경계값으로 써서 업데이트를 할 수 없습니다. 이 경우 답이 10 이 아니라 답이 19죠. 🙂
그러면 어떻게 하면 한번에 SubArray를 추출할 수 있을까요?
저도 이부분에 대해서는 의문입니다. 한번이 중요한데 말이죠..
O(N) 이라고 해서 무조건 한번은 아니죠. 🙂 kth element 구하는 등의 유명한 문제들은 분할정복으로 구현하지만 O(N) 이고요.
링크하신 분은 맞게 푸셨어요. 두 솔루션의 차이점은, 음수가 나오더라도 그 수를 무조건 버리지 않는다는 것입니다. 위 케이스에서 -1 을 오른쪽 끝으로 하는 subarray 중 최대의 합은 9 입니다. -1 의 오른쪽에 있는 5 입장에서는, 음수가 나왔다고 전에 나왔던 수를 다 버리는 것보다 9를 가져가는 쪽이 이득이겠죠?
이런 intuition 을 기반으로 생각해보시면 정답이 나올껍니다. 😀 생각하는 프로그래밍에 봐도 잘 나와있어요~
계속 더하다가 sum이 0보다 작거나 같아지면 새로 시작하면 될 거 같은…
sum이 0보다 작거나 같아지면 새로 시작하도록 해서는 안되고 다음 원소보다 작은 경우에 새로 시작해야 합니다.
그 이유는…잘 생각해보시면 될 듯…:)
이런 죄송합니다. 제가 착각을 했네요. 위에 제 답변은 틀렸습니다. sum이 0보다 작거나 같아지는 순간에 배열을 새로 시작하는 것이 맞고, sum에 대한 max값을 관리하는 것이 맞습니다.
O(N) 은 다이나믹 프로그래밍 기법이구요,
자세한 내용은 아래 책을 보시면 됩니다.
Programming Pearls (2nd Edition)
http://www.amazon.com/Programming-Pearls-2nd-Jon-Bentley/dp/0201657880
Column 8: Algorithm Design Techniques
A Scanning Algorithm
번역본:
생각하는 프로그래밍 – 프로그래밍 본질에 관한 15가지 (원제 : Programming Pearls, 2nd Edition)
http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200301140012
문제와는 다르게….
다이네믹 프로그래밍 기법이 무조건 O(n)인것은 아닙니다.
아래 링크를 일단 보시면..
http://www.freesearch.pe.kr/578
지금 계산하는것이 이전에 계산한것의 결과와 연관성이 있을경우 다이내믹 프로그래밍 기법이 적용되는 것입니다.
링크에 잘 설명이 되어 있을겁니다.
책은 바로 구입해서 지금 잘 보고 있습니다. 추천감사합니다. ^^