문제는, 말 그대로 간단하다. 주어진 배열의 모든 부분집합을 구해내는 것. 짱구 한 10분 굴려 나온 코드의 아이디어를 스케치 해보자.
우리가 일반적으로 주어진 배열에 대하여 k-개의 원소로 된 부분집합을 다 구하고자 할 때는 다음과 같은 절차를 따르게 된다.
위에서 붉은 색이 선택한 요소라 하자. 위 그림은 2개의 원소로 된 부분집합을 모두 구하는 절차를 표현한 것이다. 우선 가장 왼쪽의 요소 2개를 선택할 것이다. 그 후, 가장 오른쪽 요소를 한 칸 오른쪽으로 옮기겠지. 이런 식으로 계속 오른쪽으로 한 칸씩 옮기면서 2개로 된 부분집합을 만들어 나가는 것이다. 그러다 더이상 움직일 수 없다면 이제 바로 앞의 요소를 한 칸 오른쪽으로 옮기는 것이다. 물론 이 단계에서 가장 오른쪽에 있던 요소는 다시 앞으로 이동을 하되, 현재 오른쪽으로 옮긴 요소보다는 바로 앞 칸에 있어야 하겠지(위 그림에서 (1) 이라고 표시된 부분).
위 절차를 일반성을 잃지 않고 (ㅋㅋ without loss of generality), 자연수 k 개로 확장하면 1 우리가 원하는 알고리즘이 된다. 코드로 표현하면 다음과 같다. 2
위 코드를 C++로 옮기면 다음과 같을 것이다.
뭐, 효율성이나 코드의 aesthetics 따윈 보이지 않는, 참으로 날것의 코드 :) 어쨌거나 위에 나타난 기본적인 방법을 이용하면 좀 더 일반성 있는 코드 - 가령 iterator나 template을 이용하거나 - 나 좀 더 효율적인 코드(특히 파이썬 코드에서)를 작성하는 것에는 큰 어려움이 없을 것이다. 언제나 중요한 것은 idea 니까, 코딩 따위야 그냥 뭐 하면 되는 거지...
우리가 일반적으로 주어진 배열에 대하여 k-개의 원소로 된 부분집합을 다 구하고자 할 때는 다음과 같은 절차를 따르게 된다.
위에서 붉은 색이 선택한 요소라 하자. 위 그림은 2개의 원소로 된 부분집합을 모두 구하는 절차를 표현한 것이다. 우선 가장 왼쪽의 요소 2개를 선택할 것이다. 그 후, 가장 오른쪽 요소를 한 칸 오른쪽으로 옮기겠지. 이런 식으로 계속 오른쪽으로 한 칸씩 옮기면서 2개로 된 부분집합을 만들어 나가는 것이다. 그러다 더이상 움직일 수 없다면 이제 바로 앞의 요소를 한 칸 오른쪽으로 옮기는 것이다. 물론 이 단계에서 가장 오른쪽에 있던 요소는 다시 앞으로 이동을 하되, 현재 오른쪽으로 옮긴 요소보다는 바로 앞 칸에 있어야 하겠지(위 그림에서 (1) 이라고 표시된 부분).
위 절차를 일반성을 잃지 않고 (ㅋㅋ without loss of generality), 자연수 k 개로 확장하면 1 우리가 원하는 알고리즘이 된다. 코드로 표현하면 다음과 같다. 2
위 코드를 C++로 옮기면 다음과 같을 것이다.
뭐, 효율성이나 코드의 aesthetics 따윈 보이지 않는, 참으로 날것의 코드 :) 어쨌거나 위에 나타난 기본적인 방법을 이용하면 좀 더 일반성 있는 코드 - 가령 iterator나 template을 이용하거나 - 나 좀 더 효율적인 코드(특히 파이썬 코드에서)를 작성하는 것에는 큰 어려움이 없을 것이다. 언제나 중요한 것은 idea 니까, 코딩 따위야 그냥 뭐 하면 되는 거지...
'컴퓨터 > 수학이랑' 카테고리의 다른 글
알고리즘 관련 글의 병목 현상에 대하여 (0) | 2010.08.29 |
---|---|
p-value란 무엇인가 (87) | 2010.08.02 |
두 단어의 '유사도'를 측정하기 (resemblance) (0) | 2010.07.06 |
resampling을 이용한 방법 (bootstrapping) (3) | 2010.07.02 |
수치해석학은 무엇을 배우는 과목인가 (1) | 2010.06.30 |