알고리즘 공부 어떻게 해야할까?

내가 여태 알고리즘 문제를 풀면서 해왔던 방식

나는 대학교 1학년 때 처음 알고리즘을 접했다. 대학교에 오기 전까지 수학은 그냥 정해진 공식에 값을 넣고 결과를 구하는 방식으로만 해결해왔다. 결국 이런 방식으로만 해결하던 습관 때문에 처음 알고리즘 문제를 접하고 나서 큰 문제가 많았다. 문제를 어떻게 해결할지 먼저 생각하고 계획한 후에 접근해야 하는데, 나는 항상 먼저 코드부터 입력했다. 하지만 정작 나는 알고리즘에 관심이 없어서 이러한 문제를 해결하려고 시도하지도 않았다. 그러던 어느 날 간단한 알고리즘도 쉽게 풀지 못하는 내 모습을 보고, 진지하게 관심을 가지고 공부해야겠다고 마음먹었다.

앞으로의 알고리즘 공부 어떻게 해야 할까?

  • 구현력
  • 문제해결능력
  • 배경지식

1. 구현력

구현력은 내가 생각한 알고리즘을 그대로 소스코드로 구현하는 과정이다. 프로그램 순서도를 명확하게 그리고 사용해야 할 변수나 함수의 데이터 타입 등을 올바르게 정하는 과정이다. 이 능력이 부족하면, 문제를 풀려고 할때 “어떤 느낌인지는 알겠는데 막상 코드를 작성하려고 보니 시작도 못하겠다”, “내가 뭘 하고 있는지 모르겠다.” 라는 생각이 든다고 한다. 그렇다 바로 나다. 나는 접근하는 방식부터가 문제였다. 항상 주어진 문제에 그냥 수학공식대로 때려 박아서 문제를 풀던 나에게는 큰 고난이었다. 구현력을 향상시키기 위해서는 “내가 어떤 프로그램을 만들고자 하는지”를 명확하게 해야 한다. “무엇을 입력받아 어디에 저장하고 어떤 과정을 거쳐서 중간 결과로 무엇을 얻고 최종적으로 이런 결과물을 이렇게 출력한다” 이와 같은 순서로 먼저 적고 디테일하게 어떤 데이터 타입 자료구조에 저장할지 생각하는 것을 차근차근 적어가면서 연습하는 게 좋다. 이런 방식이 익숙해지면, 코딩하면서 동시에 생각하는 수준까지 될 수 있다고 한다.

2. 문제해결능력

내가 알고 있는 알고리즘, 자료구조, 다양한 기술을 문제에 맞게 적용하여 문제를 푸는 것, 문제를 창의적인 시각에서 접근하여 해결하는 능력은 내가 여태 공부해왔던 방식과는 정반대의 방식인 거 같다. 이 능력을 키우기 위해선 “양질의 문제를 고민하면서 푸는 것”, “이전에 본인이 풀었던 다양한 방법들을 잘 정리해두는 것”이 좋다고 한다.

3. 배경지식

기초적인 프로그래밍 문법, 알고리즘, 자료구조를 뜻한다. 이 능력이 부족하면 문제를 접근조차 할 수도 없다. 제일 공부하기 쉬운 능력이고, 시간만 투자한다면 누구든 키울 수 있는 능력이다.

바로 문제를 풀면서 위에 적은 것들을 잊지 않고 해보도록 하겠다.

문제 설명

단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두 글자를 반환하면 됩니다.

ex 입력값이 “abcde”면 반환값은 “c”, 입력값이 “qwer”이면 반환값은 “wq”이다.

이해

  • 입력값이 홀수면 가운데 한글자를 반환한다.
  • 입력값이 짝수면 가운데 두글자를 반환한다.

계획

  1. 입력값이 길이가 홀수인지 짝수인지 구한다.
  2. 입력값의 길이가 짝수면 입력값의 길이를 절반으로 나눈값의 몫을 구한후, 입력값의s 에서 나눈값의 몫-1에서부터 2개의 글자를 출력한다.
  3. 입력값의 길이가 홀수면 입력값의 길이에서 절반으로 나눈값을 반올림한값 -1 에서부터 한글자를 출력한다.
function solution(s) {
  return s.substr(Math.ceil(s.length / 2) - 1, s.length % 2 === 0 ? 2 : 1)
}

사용한 함수