푸코의 진자에서 순열 문제가….

어제 오늘 그동안 시간이 없어 미뤄두었던 움베르트 에코의 “푸코의 진자“를 정말 흥미롭게 보고 있다. 보면서 카소봉라는 주인공으로 사료되는 인물이 벨보의 컴퓨터의 암호를 알아맞추는 과정에서 프로그래밍을 해서 순열을 구하고 그 순열의 나열 순서에 따른 답을 입력하는 부분이 나온다.

책에서는 Basic프로그램으로 4개의 char의 경우에 대한 프로그래밍 예제가 나오고 그것을 이용해서 카소보가 permutation 프로그래밍을 하는 대목으로 이어지는 것이다.

처음에 이스라엘에서 하느님을 나타내는 “YAVH”라는 4 char로 이루어질 수 있는 단어의 갯수를 확인하지만 이것은 경우의 수가 너무 적어서(24가지) 아니라고 가정하고 2개의 모음을 더 넣어서 “Iahveh” permutation을 구한다.

여기서 나온  36번째 문자열을 입력하고 120번째 문자열을 입력하면서 이 부분에 대한것은 마무리 지어 진다.

물론 책에서 이 방법이 답은 아니였지만 재미삼아 D 언어로 직접 구현해 봤다.

[CODE c]
import std.stdio;

void permutation(inout char[] str, int n){
   
    if(n == str.length – 1 ){
        writefln(str);
        return;
    }

    for(int j = n; j < str.length;j++){
        swap(str[n], str[j]);
        permutation(str, n + 1);
        swap(str[n], str[j]);
    }
}

void swap(inout char a, inout char b){
    char temp = a;
    a = b;
    b = temp;
}

void main(char[][] argv){
    char[] chars = “Iahveh”;
    permutation(chars, 0);
}
[/CODE]
ps. “inout” 이라는것은 인자를 reference로 넘긴다는 뜻이다.

풀었지만, 이 문제는 일반적인 컴퓨터 전공자에게도 쉽게 풀수 있는 문제는 아니다.

책에서 카소봉이라는 주인공이 2시간 만에 풀었다고 하는데, 전산 전공도 아니고 문과생인데 이것을 고작 2시간만에 풀었다는 것이다.

책이 약 17년 전에 초판이 나왔고 여기서 쓰인 프로그래밍 언어가 Basic인것을 감안해서 Baisc이 recursion이 가능했는지 모르지만, 여러 정황을 봤을때 주인공이 괜히 주인공은 아닌거 같다.
그리고 책의 오류는 이것의 36번째 120번째 단어를 찾아서 넣었다고 하는데 이 문제를 어떻게 푸느냐에 따라 720개의 결과가 순서가 영 다르게 나올 가능성이 충분히 있는 문제다. 그래서 결과를 알파벳 순으로 정열 한다든지 다른 확실한 출력 조건이 주어졌다면 정확한 문제가 되었을 텐데 좀 아쉽기도 하다.

장미의 이름 이후로 에코의 소설을 다시 잡게 만든게 바로 이런점이 소설속에 녹아 있기 때문이다. 소설이 다소 분석적이고….. 논리적이며…굉장한 지식의 보고라는거.

CC BY-NC 4.0 푸코의 진자에서 순열 문제가…. by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.