본문 바로가기
이것저것

알고리즘이 중요한 이유

by shinhyogeun 2020. 8. 21.

 요즘도 알고리즘 문제는 꾸준히 풀고 있다. 하지만 알고리즘을 푸는 것과 내가 내 프로그램을 만드는 것은 많은 차이가 있다.

처음으로는 막상 알고리즘은 하나의 문제를 효율적인 방법으로 푸는 문제이다. 하지만 그 문제가 거대한 프로그램의 부분으로 들어갈 때 알고리즘보다 중요한 것은 기반이 되는 코드인 것 같다. 다른 곳과 잘 연결되게 만들어야 하는 것도 중요하지만 기능의 확장을 위해 보다 기저까지 신경 써야 한다는 말이다.

 

 예를 들자면 내가 만드는 어플인 타닥에서도 이러한 부분은 찾을 수 있다. 사용자가 backspace를 눌렀는지 인식하는 방법, 사용자가 글자를 적을 때 적어야 하는 글자와 적은 글자가 맞는지 틀리는지, 틀리다면 몇 개의 자모가 틀린 지 실시간으로 파악하는 방법 등은 타자게임을 만들 때 고려해야 하는 상황이다. 각각은 마치 우리가 자주 접하는 알고리즘의 문제와 비슷하다. 하지만 저런 기능들을 모아 더 큰 기능을 만든다고 생각해보자.

 

1. 사용자가 문장을 적을 때 이번 문장에서 몇 개의 자음,모음을 틀리고 있는지를 세어서 틀린 자모당 1초를 증가시키려는 기능을 만들자!

  (단 틀린 자모를 돌아와서 다시 정정한다면 시간도 다시 1초 감소시켜줘야 합니다!)

 

이 기능은 위에서 우리가 해야 하는 여러 문제들을 이용해서 풀어야 하는 더 큰 문제이고 이런 게 사용자가 맞닥뜨리는 "기능"이 된다.

 

<생각 1> 

잘못 입력하면 잘못 입력한 개수를 파악해서 시간을 늘리고 또 사용자가 backspace를 누르는 것을 인식하면 그리고 그게 틀린 글자였다면 그게 그 글자가 몇 개의 자모를 틀렸었는지를 파악해 다시 시간을 줄여주자. 맞는 글자라면 시간을 줄여줄 필요는 없다.

 

<생각 2>

실시간으로 지금 글자까지 몇 개의 자모를 틀렸는지 세어서 배열로 만든 후 각 원소와 그 전의 원소를 뺀다. 그것의 마지막 원소 값을 반환한다. 그것이 실시간으로 시간을 줄여줘야 하는 숫자다.(음수도 나온다.)

 

나는 2번 생각이 더 이쁜 생각인 것 같다. 많은 2가지 상황을 1번의 논리로 처리가 가능하기 때문이다. 근데 몇 번의 연산이 필요한지는 그 속에 들어가는 더 작은 알고리즘들의 문제이니 큰 뭉치에서는 생각 2번이 더 좋은 것 같다.

 

이렇듯 알고리즘은 너무 자주 생각하게 되는 문제이다. 그래서 알고리즘은 중요하다. 알고리즘이 익숙해지면 내가 만드는 프로그램의 질이 달라진다.