잡동사니

알고리즘을 공부해야하는 이유 본문

IT/Algotithm

알고리즘을 공부해야하는 이유

yeTi 2022. 12. 5. 14:13

안녕하세요. yeTi입니다.
오늘은 제가 알고리즘을 공부해봐야겠다고 마음먹은 계기에 대해 공유하고자 합니다.

의문

저는 스스로 의미있는 목표를 가졌을 때 행동하는 성향을 가지고 있습니다.

이러한 이유로 취준생시절 다들 토익공부에 매진할 때 저는 영어 회화를 공부했었고, 단순 암기를 수행하는 교과목을 비선호 했으며 관습에 의해 행해지는 업무를 좋아하지 않습니다.

알고리즘도 비슷하게 생각했습니다.

이전 수학을 배울 때 삶에 무슨 의미가 있는지 이해가 안된것 처럼 알고리즘이 실무에 어떤 개선을 제공하는지 알지 못하여 스스로 동기부여를 할 수 없었습니다.

깨달음

최근에 파트원 중 한분이 알고리즘 문제를 3일동안 풀어보고 파트내에 리뷰를 해준 경험이 있었습니다.

도형이 일치하는 위치의 수를 세는 문제 였는데요. DFS 를 공부해보니 풀 수 있었다는 피드백을 받았습니다.

그 동안 막막하던 문제가 알고리즘을 알고나니 풀리는 구나

라는 생각을 처음하게 됐고, DFS, BFS 는 한번 공부해봐야겠다는 생각을 가졌습니다. 그러면서 이전에 백기선님이 추천해주신 red black tree 도 포함되있으면 좋겠다는 생각을 했습니다.

그렇게 찾은 권오흠 교수님2015 봄학기 알고리즘.

1강을 듣고는 충격을 받았고 알고리즘을 반드시 공부해 봐야겠다는 다짐을 하게 됐습니다.

충격

1강recursion 이 주제였습니다.

1차원 배열에서 Max 를 찾는 로직을 어떻게 구현할까요?

라는 질문을 하셨습니다.

저는 당연히 아래와 같이 생각했습니다.

Integer max = 0;
for (int i = 0; i < arr.length; i++) {
  if (arr[i] > max) {
    max = arr[i];
  }
}

교수님은 그렇게도 풀 수 있지만 recursion 을 사용할 때 좀 더 명료해질 수 있다는 말씀을 하십니다.

max(arr, 0, arr.length - 1);

public int max(int[] arr, int begin, int end) {
  if (begin == end) {
    return arr[begin];
  } else {
    return Math.max(data[begin], max(arr, begin + 1, end));
  }
}

위의 코드를 봤을 때, 실무에서 노력하고 있는 논리의 명확한 표현 이 된다는 부분에서 놀라운 감정을 느꼈습니다.

이 후, 다음과 같은 질문을 하십니다.

로직을 처음부터 탐색하는것이 아니고 중간부터 하면 어떻게 될까요?

max(arr, 0, arr.length - 1);

public int max(int[] arr, int begin, int end) {
  if (begin == end) {
    return arr[begin];
  } else {
    int middle = (begin + end) / 2;
    int max1 = max(arr, begin, middle);
    int max2 = max(arr, middle + 1, end);
    return Math.max(max1, max2));
  }
}

!!!!!!
논리의 명료한 표현이 가능한데다가 탐색을 부분화하기 쉬워진다는데에 놀라움을 느꼈고,

만일 max() 라는 함수가 async 로 동작을 한다면 효율을 극대화할 수 있지 않을까? 라는 질문까지 생각이 도달하니 알고리즘을 공부해보면 실무에 도움이 될 수도 있겠다. 라는 생각이 들었습니다.

또한, 함수형 프로그래밍이 제시하는 원자성을 가진 함수의 조합이라는 것이 이런 느낌일까라는 생각도 들어 함수형 프로그래밍에 흥미를 가지는 계기가 되기도 했습니다.

실무에 적용

이후 파트원들에게 느낌을 전하니, 몇몇 분들은 같이 강의를 보시기 시작했습니다.

몇일 후 버전 체크 로직에 버그가 발견하여 hotfix 건이 발생했는데요.

담당 파트원분의 코드를 보니 recursion 을 활용하여 그 동안 복잡하던 로직을 간결화 하시고 테스트 코드도 작성하신것을 보고

실무에 즉시 적용하신 부분이 대단하다는 생각이 들었고 저 스스로도 변화의 계기를 제공했다는 생각에 작지않은 희열도 느꼈습니다.

결론

강의에 대한 소감은 이 후 후기를 통해 전달드릴 예정입니다.

하지만 현재 단지 1강만보고 글을 작성하게 된 계기는 스스로 오랜기간 알고리즘에 대한 동기부여를 못 하고 있던 상황에서.

또한 주변에 그런분들이 있던 상황에서.

단지 취업을 위한 공부가 아닌, 프로그래밍을 좀더 명확히 할 수 있는 방법을 알 수 있다는 목적에 의미를 가지고 알고리즘을 공부해보기로 결심한 과정을 공유하고

혹시나 비슷한 생각을 가지고 계신 분들에게 도움이 되고자 해당 글을 작성하게 됐습니다.

감사합니다.

알고리즘 저장소

'IT > Algotithm' 카테고리의 다른 글

알고리즘 공부 - sort  (0) 2022.12.15
알고리즘 공부 - recursion  (0) 2022.12.10
코딩테스트, 2020 카카오 문제 4  (0) 2020.03.20
코딩 테스트, 2020 카카오 문제 3  (0) 2020.03.19
코딩 테스트, 2020 카카오 문제 2  (0) 2020.03.18
Comments