본문 바로가기

컴쟁이의 알고리즘

알고리즘 문제를 풀 때 생각해야하는 것들

  요즘 들어 백준에서 알고리즘 문제들을 많이 풀고 있습니다.

 

  그런데 머릿 속에서 생각하고 손으로 그려보며 로직을 나름 이해했다고 생각했는데 코드로 옮기다보면

꼬이는 경우가 다반수입니다. 만일 간단한 문제라면 생각하고 손으로 내려오는 대로 적어도 해결되겠지만

문제가 복잡하다면 코드를 작성하던 중에 이전 내용을 한번 놓치면 계속 같은 곳을 빙빙 돌게 되지요.

 

  항상 문제라고 생각만 하였지만 막상 고쳐보려하니 답답하기만 했었는데요, 오늘 유투브에서 강의를 보다가 문득

고칠 수 있는 방법을 생각해냈습니다.

 


 

  우선 평소 하던 것처럼 머리로든 손으로든 직접 문제를 해결해보며 로직을 이해합니다.

그리고 그 흐름을 머릿 속으로 한번 그려봅니다.

그리고 코드를 작성하기 이전에 주석을 이용해서 그 흐름을 코드창에 옮겨 적습니다. <- 이게 제일 중요합니다.

 

  단순한 for문으로 해결할 수 있는 문제라면 틀릴 확률이 적지만 만약 꼬이기 쉬운 재귀함수를 사용하는 경우에는

정말로 짜다보면 내가 지금 뭘 짜고 있었는지 고민하게 만들 정도로 바로 적어내려가기가 쉽지 않습니다.

 

  이럴 때 미리 흐름을 코드창에 주석으로 적어놓는다면 코드를 적으면서 생각할 필요 없이 주석으로 적은 부분들만

코드로 변환하며 더 좋은 방법을 생각해내는데 큰 도움이 될 것입니다.

 

 


 

  그리고 또 하나, 코드가 좀 길어지거나 여러번 사용할 것 같은 부분들은 함수로 빼주는 것이 보기에 깔끔합니다.

물론 보기에 깔끔할 뿐이지 내가 이미 다 이해하고 있는데 굳이 귀찮게 그렇게 해야 하나 싶을 수도 있습니다.

 

  하지만 함수로 뺀다는 것은 어딘가 틀렸을 때 빛을 발합니다.

함수는 보통 해당 함수가 해야하는 기능을 이름으로 적고, 따로 떨어뜨려 놓았기 때문에 한눈에 보기 좋습니다.

즉, '그 기능만 온전히 돌아가는지 확인하기'에 너무너무 좋은 방법입니다.

 

  앞서 드린 말씀과 연계한다면 주석으로 적어놓은 부분들 중에 중요한 알고리즘 부분이나 복잡할 것 같은 기능들은 우선 함수를 적어 '이미 만들었다치고' 쭉쭉 적어나간다면 전체적인 흐름이 막힐 일은 없을 것입니다. 그렇다면 그 다음은 해당 기능들을 정확하게 구현만 해준다면 전체 로직이 꼬일 일이 없다는 의미입니다. 이런 방법으로 알고리즘 문제를 해결한다면 전체 흐름을 읽으려 마우스 휠을 위아래로 왔다갔다하며 고민하는 시간이 크게 줄어들 것입니다.

 

 


 

  마지막으로 작은 팁을 드리자면 재귀함수를 사용할 때에는 머릿속에 'Flat하게 짤 것' 이 한마디를 머릿속에 각인시켜두시길 바랍니다. 재귀는 특히 전역 변수와 parameter가 혼용되어 사용될 가능성이 높기때문에 꼬이기 쉬울텐데요. 이럴 때에는 '지금 단계에서 해야할 일'만 우선 생각해본 뒤에 '종료될 조건'을 제일 맨 위에 적고 return을 해준다고 Flat하게 생각하면 정리하는데 큰 도움이 될 것입니다.

 

  아, 그리고 다음 단계로 넘겨줘야할 prarmeter에 'cnt++' 등의 연산은 하지 말고 넘겨줄 때 'cnt+1'을 해주는 방식으로 짜는 것이 올바른 방향일 확률이 높습니다! 혹시 재귀가 돌고 있지 않으시다면 한번 확인하시는 건 어떨까요?

 


 

  오늘은 제가 문제를 풀다가, 혹은 강의를 듣던 중에 생각한 '이렇게 하면 더 좋겠다!'라는 방법들에 대해 말씀드렸습니다. 제가 말씀드린 것들 중에 아직 시도해보지 않는 방법이 있다면 적당한 알고리즘 문제 하나 풀면서 적용해보시기 바랍니다!