NOW OR NEVER

자료구조와 알고리즘이란? 본문

Algorithm

자료구조와 알고리즘이란?

LAURA 2022. 2. 15. 19:45
반응형

자료구조와 알고리즘이란?

  • 프로그래밍은 요리와 비슷하다(요리 : 재료선택-도구선택-레시피-요리완성)
    • 재료 : 데이터
    • 도구 : 자료구조
    • 레시피 : 알고리즘
    • 요리 : 소프트웨어
    • 요리사 : 개발자
    • 요리를 먹는 손님 : 소프트웨어를 이용하는 이용자
  • 자료구조 + 알고리즘 = 프로그램

자료구조

  • 메모리를 효율적으로 사용하며 메모리를 빠르고 안정적으로 데이터를 처리하는 것이 궁극적인 목표이다.
  • 구조들은 상황에 따라 유용하게 사용될 수 있도록 만들어져 있다. 그래서 어떤 상황에서는 느리고 불안정적일 수 있다.
  • 상황에 맞는 올바른 자료구조를 선택할 수 있는 능력이 필요하다
  • stack, queue, graph, tree 등이 해당된다.

알고리즘

  • 특정 문제를 효율적이고 빠르게 해결하는 것이 궁극적인 목표이다.
  • 정해진 일련의 절차나 방법을 공식화한 형태로 표현한 것을 말한다. 즉 수학적인 형태로 표현 가능하다는 말이다.
  • 자료구조와 마찬가지로 특정 상황에 유용하게 쓰일 수 있다. 반대로 적합하지 않은 상황도 존재한다.
  • Binary Search(2진 탐색), Shortest Path(최단거리 찾기) 등이 해당된다.

자료구조와 알고리즘이 중요한 이유

  • 실무에서 중요하게 생각하는 3가지
    • 기초 코딩능력 : 코딩 능력과 논리적인 사고 능력 즉 문제해결능력을 말한다. 자료구조와 알고리즘을 공부하면서 기를 수 있는 능력이다.
  • 전문 분야 지식 : 백엔드, 프론트엔드, 안드로이드, 딥러닝 등의 특화된 전문지식을 의미한다. 깊이 있게 알수록 좋고 최신 트렌드를 잘 따라가면 더 좋다.
  • 기본 CS(Computer Science) 지식 : 운영체제, 네트워크, 소프트웨어 공학, 컴퓨터 구조 등 학문적인 지식을 말한다. 기본 CS 지식이 탄탄할수록 업무 상황에서 발생하는 예외 상황에 빠르게 대처할 수 있다. 면접 때도 자주 물어보는 기본적인 지식이다.
  • 멋지고 어려운 일을 해내는 회사는 특정 프레임워크나 라이브러리에 정통한 사람을 찾지 않는다.
  • 소프트웨어 세상의 문제는 계속해서 달라지기 때문에 괜찮은 회사는 문제해결능력을 갖춘 상태에서 새로운 기술을 습득하고 빠르게 활용할 수 있는 사람을 찾는다.
  • 논리적인 사람은 더 빠르게 문제를 해결하고 좋은 코드를 작성하지만 논리적인 사고가 결핍되어 있는 사람은 아무리 코딩을 열심히 배워도 좋은 코드를 작성하지 못하기 때문이다.
  • 개발자의 정체성이 되어줄 지식인 자료구조와 알고리즘을 배워두는 것이 좋다.
  • 문제 해결 능력 향상
    • 논리적 사고 : 어떠한 현상이 존재할 때 추론하고 구조화하여 해답을 내는 것을 의미한다. 즉 해결방법의 절차가 말이 되는가가 문제해결능력에서 중요하다.
    • 전산화 능력 : 현실에 있는 것을 컴퓨터 세계 즉, 소프트웨어로 구현하는 것을 의미한다. 컴퓨터 프로그래밍의 세계는 논리로 이루어져 있다고 해도 과언이 아니다. 그래서 이 논리를 조합하여 컴퓨터적인 사고가 가능한가가 전산화 능력이라 할 수 있다.
    • 엣지 케이스 탐색 능력 : 이 능력은 예외상황을 얼만큼 잘 찾는지를 의미한다. 아무리 잘 작성한 소프트웨어라도 버그가 존재할 수 있다. 만약 미처 생각하지 못했던 데이터가 들어온다면 더욱 버그가 생길 확률이 높아진다. 여기서 미처 생각하지 못했던 것을 미리 생각하는 능력이 엣지케이스 탐색 능력이다.
    • 위 세가지가 문제 해결능력의 핵심이다. 그리고 문제 해결 능력은 흔히 우리가 표현하는 일머리라 할 수 있다.
  • 자료구조와 알고리즘을 알아두면 좋은 점은 변하지 않는다는 점이다.
  • 지금도 최단거리 알고리즘중 하나인 Dijkstra Algorithm은 1956년에 만들어짐. 곧 70년이 다되어가는데도 현역이다.
  • 자료구조와 알고리즘은 잘 변하지 않기 때문에 알아두면 두고두고 쓸 수 있다.
  • 사례
    • 상황 : 100만개의 고객 데이터를 최신으로 업데이트 하기 위한 배치 작업이 필요하다. 이 업데이트 하기 위한 100만개의 데이터는 정제되지 않은 CSV 파일로 제공되었다. CSV 데이터 중 기본 DB에 없는 데이터(고객)를 추가해야 하는데 해당 데이터에 key가 되는 값이 없기 때문에 DB의 여러 필드를 대조하여 찾아야만 한다.
    • 구현 : 단순히 100만개 데이터를 매번 순회하여 데이터를 찾은 후 최신으로 업데이트 하고 데이터가 없다면 새로 데이터를 추가하는 방식으로 구현했다. 이런 방식은 굉장히 단순하고 느린 방식이다.
    • 결과 : 계산했을 때 이 CSV 파일 하나를 처리하려면 5일이 넘게 걸렸기 때문에 다시 로직을 작성 해야 했다.
    • 개선 : 해시테이블과 링크드 리스트를 이용하여 데이터 구조를 바꾸고 이진 탐색을 이용한 알고리즘 적용한다, 결과적으로 코드를 변경한 후 5일 동안 걸릴 로직을 20분만에 맞출 수 있도록 크게 성능 개선할 수 있었다.
      • 기존 DB의 100만개 데이터를 이름을 기준으로 해시 테이블에 기록
      • 동명이인이 있을 경우 해시 테이블 value를 링크드 리스트로 데이터 추가
      • 고객을 찾을 때 이름을 키로 찾은 후 동명이인이 여럿 존재한다면 이진 탐색 사용
      • 최종적으로 20분만에 100만개 데이터 처리
    • 이 사례를 통해 알 수 있는 점 : 자료구조와 알고리즘이 크게 업무에 필요하지 않다는 사람도 있지만 언젠가는 반드시 중요할 순간이 온다.

'Algorithm' 카테고리의 다른 글

시간 복잡도  (0) 2022.02.21
자료구조의 종류  (0) 2022.02.16
Comments