알고리즘

알고리즘 공부할 때 풀지 못할 어려운 문제를 마주한 경우

Dibrary 2022. 6. 22. 09:50
반응형

안녕하세요 Dibrary입니다.

알고리즘 문제를 풀다 풀지 못하겠다 싶은 문제를 마주한 경우가 꽤 있으실 겁니다.

예를 들면 백준에서

내 등급이 '실버'지만, 실버 문제를 풀지 못하는 경우

 

이런 경우 많죠. 근데, 그러면 대부분 1~2시간 가량 고민해 본 뒤에 다른 사람의 해답을 봐라. 라고 합니다.

근데, 거기서 끝내면 자기 공부가 안 됩니다.

 

제가 어려운 문제를 마주한 경우 어떤 방법으로 해 나가는지 정리해보겠습니다. 뭐 꼭 이렇게 해야 한다는 것은 아니지만, 확실한 것은 '저'에게 효과가 있었던 방법입니다.

 


1. 문제를 보고 떠오르는 생각을 정리해 둔다.

말 그대로 해당 문제는 어떤 방식으로 풀어야 할거 같다. 어떤 제약이 있는 것 같다. 그냥 단순히 접근하면 어떤 어려움에 봉착할 거 같다. 등 떠오르는 생각을 그냥 막 적어나가면 됩니다.

위 문제를 예를 들면 저는 아래와 같은 생각이 제일 먼저 떠올랐었습니다.

  • 움직이는 횟수를 다 쓰지 않아도 된다.
  • 움직이고 나서 +가  더 늘어나는지를 봐야 한다.
  • 안 움직였다면 얼마인지를 알 필요가 있나? (비교할 때 써먹나?)
  • 시작 위치는 1번 나무다.

 

이렇게 미리 '주석'처리를 해놓은 부분에 정리해 놓고 시작을 해 보세요. 

다짜고짜 문제만 본 후에 구현으로 들어가 버리면 떠올랐던 생각 역시 금방 휘발되어서 더 어렵게 느껴질겁니다.

 

 

2. 시간을 들여 떠오르는 생각을 구현 해 본다.

위에서 자신이 정리한 내용에 한해서 '코드'를 작성 해 보는 겁니다.

여기서 중요한 것은 꼭 '정답'이 나오지 않아도 됩니다. 내 생각을 코드로 구현할 수 있느냐가 관건이죠.

 

 

3. 안 되면 답을 본다.

그럼에도 해결이 안 되면 답을 찾습니다. 근데, 여기서 중요한 포인트는

코드는 '어떻게 문제를 해결하는가'에 초점을 맞추는 겁니다.

 

코드 자체를 외우거나 하려고 하지 말고, 어떤 풀이방법이구나~ 하는 걸 이해하면 됩니다.

 

예로 제가 구현한 다른 문제의 코드를 보여드리겠습니다.

위 코드를 보면서 떠오른 생각은 아래와 같습니다.

  • 입력을 받으면서 최소값을 유지하게 하는구나.
  • 1차 조건문에서 min_p가 min_s*6보다 크면 곧바로 끝내는구나.
  • 2차 조건문에서 (n%6)*min_s > min_p 부분이 들어있구나. (내가 생각하지 못한 부분)

이렇게 '아이디어'만을 캐치하는 겁니다. 코드가 중요한 게 아니라 이 '생각'이 중요합니다.

 

 

4. 생각을 다시 구현해본다.

이제 아이디어가 정리 되었으면 이 내용을 자신이 직접 구현해 보는 겁니다.

물론, 다른사람 코드 '안'보고 말이죠. ㅎㅎ

"이미 다 본거니까 엄청 쉽겠다~" 이렇게 생각하는 분 있으실텐데, 생각보다 그렇지 않습니다.

 


이상으로 핵심은 이겁니다.

생각하는 힘을 키우는 것이 중요하다.

 

남에꺼 보는 것 자체에 거리감을 두는 분들이 꽤 있는데, 이렇게 하면 실제로 '생각'을 구현하는 훈련이 됩니다. 알고리즘 공부를 하면서 항상 이 부분이 가장 맹점이었는데요, 저는 이렇게 극복해 나가고 있습니다.

이 과정에서 생각을 구현한 '나만의 코드'가 나오는 게 전 정말 좋았습니다.  이 코드가 나온 이후부터는 코드의 깔끔함, 효율성 등도 고려해보면 좋습니다.

 

이상으로 제가 공부하는 방법을 정리해 보았습니다. 
물론 가장 좋은 방법은 '자신에게 맞는 방법'을 찾는게 더 좋습니다.

728x90
반응형