출처 : https://www.whatwant.com

 

이번에 살펴볼 것은 한글로 말하자면, "막대 자르기" 알고리즘이다.

어떤 문제를 해결하기 위한 알고리즘인지 알아보자.

 

[Problem]

n만큼의 길이를 갖고 있는 막대기가 있다고 하자.

 

출처 : https://www.whatwant.com

 

이 막대기를 잘라서 팔아야 하는데, 길이에 따라서 판매되는 가격이 다르다고 했을 때

어떻게 잘라서 팔아야 최대 이익이 나오는지를 찾아내야 하는 것이 문제이다.

 

 

위와 같이 막대기 길이에 따른 수익은 제시가 된다.

알아야 할 notation 규칙은 다음과 같다.

 

 

[Brute force approach]

"n = 4" 만큼의 길이를 갖고 있는 막대기가 있고, 길이에 따른 가격은 다음과 같다.

 

출처 : https://www.whatwant.com

 

이 때, 나올 수 있는 모든 경우의 수를 다 살펴보자면 다음과 같다.

 

출처 : https://www.whatwant.com

 

최대 수익을 얻기 위해서는 ⑶번과 같이 2개 묶음으로 나누는 경우가 10만큼의 수익을 얻을 수 있다.

그런데, 이처럼 모든 경우의 수를 나열해서 모두 계산해보기에는 너무 비효율적이다.

 

[Rod-Cutting Algorithm]

일단 다음과 같은 계산식을 살펴보자.

 

 

n 길이의 막대기가 있을 때, i 길이의 가격과  'n - i' 길이일 때의 최대 수익의 합이 최대인 i값을 찾는 것을 의미 한다.

 

출처 : https://www.whatwant.com

 

다음과 같은 문제가 주어졌다고 해보자.

 

 

r[i], s[i] 값은 다음과 같이 계산해볼 수 있다.

 

 

그러면 다음과 같은 결과를 얻을 수 있다.

 

 

이렇게 만들어진 표가 있다면,

8 길이만큼의 막대기가 주어졌을 때 다음과 같이 활용할 수 있다.

 

출처 : https://www.whatwant.com

 

[Pseudo Code]

 

 

[Time & Space]

이 알고리즘에서는 r[n], s[n] 값을 저장하기 위한 메모리 공간을 필요로 한다.

길이 n 값에 선형으로 비례하는 만큼 사용하기 때문에 다음과 같이 정리할 수 있다.

 

 

소요 시간은 Pseudo Code를 보면 중복 for문이 사용되는 부분을 잘 살펴봐야 하는데,

다음과 같이 정리 해볼 수 있다.

 

 

수고하셨습니다 !!!

반응형

+ Recent posts