본문 바로가기
도서/프로그래밍

[쓰면서 익히는 알고리즘과 자료구조](0) 왜 알고리즘을 배워야 할까?

by 신발사야지 2023. 1. 25.

 

왜 알고리즘을 배워야 할까?

 

알고리즘 문제 해결 경험을 통해 실제 개발에서 어떤 문제를 해결하는데 도움이 된다.

 


노트 레이아웃을 이용한 알고리즘 문제 풀이 접근 방법

  • 문제 분석과 함께 어떤 알고리즘과 자료구조가 적절한지 파악한다.
  • 문제로 부터 요구사항과 제한사항을 수집한다
  • 어떤 식으로 접근할지 다양한 아이디어를 제시한다.
  • 코딩을 통합개발 환경 도움 없이 화이트 보드나 종이에 연습한다
  • 시간/공간 복잡도를 고려한다.
  • 어떤 테스트 케이스를 통과하는지에 대해서 고려한다.

Constraints (범위, 제한사항)

문자열, 배열 그리고 숫자

  • 배열을 얼마나 많은 요쇼들을 가질 수 있는가?
  • 문자열의 경우 길이가 얼마나 길어질 수 있는가? 숫자의 경우 최댓값과 최솟값은 얼마인가?
  • 어떤 요소들이 있는가? 숫자의 경우 정수 혹은 소수, 문자열이라면 byte 혹은 unicode 일 수 있다.

반환값

  • 문자의 반환값은 어떤 형태이고 어떤 값을 원하는지 정확히 파악하자.
  • 만약 문제에 다양한 해결책이 존재한다면, 어떤 해결책을 제공해야 하는 것인가?
  • 만약 반환해야 하는 값이 여러개라면 어떤식으로 제공해야 하는지 확인하자
  • 만약 입력값으로 허용되지 않거나 범위를 벗어나는 값이 들어왔을 때 어떤 값으로 반환해 줘야 하는지 파악할 필요가 있다.
  • 문제에 어떤 특정 값을 찾는다고 했을 때 해당 값이 없다면 어떻게 반환을 할지 확인해야 한다.

Ideas (문제 풀이 접근 방법)

보통 문제 풀이 방식은 1~3개 정도다. 다양한 방법으로 접근하고 비교하여 최적의 답을 찾는 데 도움을 줄 것이다.

Complexity (복잡도)

시간 복잡도와 공간 복잡도를 고려하자

기본 자료구조 시간 복잡도(Big-O)

스택에서 삭제는 왜 O(1) 죠? pop만 고려하는건가… 배열은 다 옮겨줘야 하고

원하는 값을 삭제하려면 스택도 O(n)일 텐데

Code (코드 작성)

개발도구에 의존하지 않고 작성하는 연습을 해보자

  • 코딩하기 전에 조금 더 고민하자
  • 변수 이름을 명확하고 알맞게 정의하자
  • 작은 단위의 논리적 조각으로 분해하여 분석하고 다른 코드와 섞이지 않도록 노력해야 한다.
  • 자신이 작성한 코드를 여러 번 검토하자

Test Cases(테스트 케이스 검토)

  • 에지 케이스(Edge case): 최극단의 값으로 테스트
  • 해결책이 없는 경우: 입력값에 Null 또는 None 이 들어왔을 경우 어떻게 처리 해야 하는지 고민해야 한다.
  • 다양한 테스트 케이스 : 여러 테스트 케이스를 스스로 생각해보는 연습도 필요하다.