본문 바로가기

Problem Solving/나의 생각

기계적인 풀이, 정형화된 틀 -> PS는 암기?

* ps = problem solving (알고리즘 문제풀이를 일컫는다.)

 

가끔 어떤 문제가 어떤 알고리즘 문제로 분류되는지를 파악하지 못할 때가 종종 있다.

풀 수는 있는데, 이게 무슨 풀이인지를 본인도 잘 모르겠는 것이다.

 

그것은 아마도 필자가 어떤 정형화된 틀이 갖춰져 있지 않음이기도 하다. 장단점이 있겠지만, 일단 생각나는 단점은 빠른 풀이가 조금 힘들 때가 있다. 척하면 팍하고 나와야 하는 코드가 바로바로 나오지 않아서 처음부터 다시 생각해야 하기 때문이다. 마치 DP에서 이전 값을 바로 참조하여 바로 현재의 값을 구하는 것처럼 빠르게 풀이가 되어야 하는데, DP[0] 또는 DP[1]부터 다시 생각해서 쌓아 올려야 할 때가 있기 때문이다. 물론 거듭된 연습으로 익숙한 형식들은 빠르게 풀겠지만, 익숙하지 않은 것들이 아직은 많다. 풀어본 적이 있거나 풀 수는 있어도 상당히 많은 생각의 시간을 요하는 경우들. 그리고 그 많은 문제들에 모두 익숙해질 순 없다.

결국 익숙하지 않은 상황에서도 익숙하게 풀 수 있는 높은 사고력이 필요한 것이다.

 

정형화된 틀을 갖추어 기계적인 풀이를 한다면 마치 PS가 그저 뭔가 암기식이고 경험자에게만 유리할 것 같이 보이겠지만, 절대로 그렇지 않다. 필자도 겉으로 어떤 상황을 모면하기 위해 그런 식으로 말하는 경우가 있더라도 실제 마음속은 전혀 다르다. 사실 그런 발언은 필자에게뿐만 아니라 알고리즘과 자료구조를 매우 사랑하는 사람들 그리고 PS 관련 대단한 실력자들 모두에게 굉장히 실례가 된다고 생각한다.

정형화된 틀은 정말 수많은 실패와 검증을 통해 다져지고 또 다져진 눈부신 코드이고 기계적인 풀이가 나오려면 정말 많은 경우의 수를 한꺼번에 모두 파악할 수 있는 경지에 올라야 가능한 것이다. 조금만 깊이를 갖게되도 사실 정형화된 틀이란 게 있다고 말하기도 어려워지고, 일률적으로 적용하는 일은 더욱 드물다는 것을 알게 된다.

 

PS를 잘하려면 프로그래밍 언어 문법과 컴퓨터 내부 동작에 대한 어느 정도의 이해가 있기도 해야겠지만, 그것보다 더 근본적으로 깊이 있는 생각을 통해 문제 자체를 해결하는 방법을 고안해야 한다. 일단 손으로 써도 (정말 아무런 프로그래밍이 아니라도) 풀 수 있는 정도의 풀이 방법을 생각해낸다면 그걸 코드로 문법에 맞추어 써내려가는 것은 앞서 했던 생각에 투자한 노력 대비 아무것도 아닌 것이다. 

 

'특정 알고리즘을 몰라서 못 풀었다'라는 생각을 갖는 사람을 종종 목격한다. 어느정도 맞는 말일 수도 있겠지만, 굳이 시비를 가려야 한다면 틀렸다고 말하고 싶다. 그 특정 알고리즘을 알았다고 몰랐던 문제를 풀 수 있었을까? 알고리즘을 알고도 못 푸는 문제가 얼마나 많은가. 애초에 꼭 어떤 특정 알고리즘이 아니라도, '어떤 방식으로 생각하면 풀 수 있을지도 모르겠다'라는 생각 자체는 떠올려야 한다는 것이다. 그리고 그 생각을 골똘히 하는 것이 노력인 것이다. 그렇게 따지면 필자는 아예 재귀/메모이제이션 그리고 백트래킹 등등을 아무것도 모르는 상태에서 오랜 고심끝에 혼자 고안해낸 적이 있다. 정점? 간선? DFS/BFS/그래프? 이런 개념이 아무것도 없던 시절인데 어떻게 백트래킹 관련 문제를 풀 수 있었을까? 생각하고 생각하여 깨달음을 얻으면 그때서야 진정한 '성장'이 발생한다. 

그래서 PS를 두고 암기라고 생각하거나, 또는 뭔가 코딩테스트용?이나 쓸데없는 잡기술? 등으로 치부하는 사람을 납득해주기 어렵다. 

 

오히려 가장 기초이고 근본이다라고 말하고 싶다.