나열하기란 조건에 맞는 모든 경우를 시도해보고 답을 찾는 일을 말한다.

이 방법은 답을 찾는 것은 오래 걸리지만 확실한 방법이다.


나열하기의 대표적인 종류로는 우리가 중, 고등학교 시절에 배웠던 순열, 조합, 중복순열, 중복조합이다.

이 코드의 틀이 가장 대표적인 나열하기의 틀이다.


각각의 방식에 따른 Subset을 풀어야하는 알고리즘에 대입하고 그 알고리즘을 거증하고, 완성시킨다.

재귀적 프로그래밍을 많이 사용하므로 재귀적 프로그래밍에 익숙해야 한다.


이 나열하기의 방식은 모든 경우를 다 따지는 것이므로 그 수행속도가 데이터의 크기에 따라 수없이 오래 걸린다.

하지만 이 나열하기의 방식을 조건에 맞게 가공하여 그 수행속도를 빠르게 할 수 있다면, 


이 시도가 퍼즐 알고리즘을 풀어내는 중요한 틀이 된다.



퍼즐 알고리즘은 무척 중요하다. 

왜냐하면 기업에서 프로그래머를 뽑을 때, 등장하는 대표적인 문제의 형태이기 때문이다.


이번에 치른 코딩테스트도 퍼즐 알고리즘에 대한 작성이었다.

그 때는 퍼즐 알고리즘이나 이 퍼즐에 대한 파트가 있는지도 모르고, 그냥 무작정 코딩하기 시작했다.


끝나고 꼭 한 번 제대로 찾아봐야지라고 생각했었는데, 막상 찾고보니 갈 길이 멀다.

하지만, 그 때의 문제를 풀면서 정말 궁금하고 몰랐던 방법론을 발견했다.


역시 책은 만인의 스승님이시다.

아무튼, 퍼즐 문제가 기업의 대표적인 테스트 문제로 많이 나타나는 이유는 이렇다.


문제의 제약조건을 잘 이해하고, 꼼꼼히 체크해야하며, 추론을 통해서 가장 효율적인 방법을 찾아 답을 구해야 한다.

위의 3가지 방식이 좋은 프로그래머인지 구분하는 정말 중요한 요소라는 것을 다시 알았다.


아직 퍼즐 이론에 대해서 많은 것을 알지 못하지만, 지금껏 해왔던 것처럼.


모르면 배우면 되니까. 아직 학생이니까.


다시 배우자.



+ Recent posts