알고리즘 원칙 세우기

윤뿔소·2024년 6월 26일
0

Algorithm / Design

목록 보기
1/15
post-thumbnail

알고리즘 문제를 풀 때, 체계적으로 접근하면 효율적이고 효과적으로 문제를 해결할 수 있다.

1. 상세 요구사항 이해

제일 중요한 부분, 시간을 써도 되니 글로 써보자

상세 요구사항을 분석하고, 작성하는 단계입니다.
문제의 본질을 명확히 이해하는 것은 해결책을 찾는 첫 걸음입니다.

작성법

예시는 Algorithm 240702 글을 보면 된다.

  1. 문제 정의 : 문제를 읽고 이해하기 위해 문제의 본질을 간단명료하게 정의.
  2. 주요 기능 및 요구사항
    • 기능 목록 : 시스템이 제공해야 하는 주요 기능을 나열.
      • 각 기능에 대해 상세한 요구사항을 기술.
      • 요구사항 간의 상관관계를 파악하고 기술.
    • 제약 조건 : 시스템 구현 시 고려해야 할 제약 조건을 기술.
  3. 예외 처리 : 발생할 수 있는 예외 상황과 그에 대한 처리를 정의.

Use Case

알고리즘 중에 너무 어려운 나머지 구조를 모르겠다면 Use Case를 적용시켜봅니다.

  • Use Case 이름 : 각 유스케이스의 명칭을 정의.
  • 행위자(Actor) : 시스템과 상호작용하는 사용자 또는 다른 시스템을 정의.
  • 사전 조건 : 유스케이스가 실행되기 전에 충족되어야 하는 조건.
  • 기본 흐름 : 유스케이스가 정상적으로 수행될 때의 단계별 시나리오.
  • 대체 흐름 : 기본 흐름에서 벗어나는 경우의 시나리오.
  • 사후 조건 : 유스케이스가 완료된 후 시스템의 상태.

이유

  • 문제를 잘못 이해하면 엉뚱한 방향으로 접근할 수 있습니다.
  • 잘못 이해한 채로 문제를 풀면 오히려 시간이 더 걸릴 수도 있습니다.
  • 명확한 요구사항 정의는 해결책의 방향성을 제시합니다.

예시

  • 배열에서 특정 숫자의 위치를 찾는 문제"라면, 주어진 배열이 정렬되어 있는지, 중복된 숫자가 있는지 등을 파악합니다.

2. 입출력 분석

입력과 출력의 형식을 이해하는 것은 코드 작성의 기본입니다.
보통 요구사항을 분석하며 같이 쓸 수도 있습니다.

이유

  • 입력의 조건과 출력의 형식을 제대로 이해해야 정확한 코드를 작성할 수 있습니다.

예시

  • 입력이 "n개의 숫자"라면, 이를 어떻게 받을지, 출력은 무엇을 어떻게 해야 할지 명확히 정의합니다.
  • 예제 케이스 분석도 하면서 문제의 주요 사항들을 테스트하면 더 이해하기 좋습니다.

3. 의사코드 작성(알고리즘 설계)

문제 해결을 위한 명확한 절차를 정의하는 단계입니다.
알고리즘, 코드 등을 구현하고 이해하기 편하게 일련의 규칙에 따라 인간의 언어로 작성한 기록물입니다.

작성법

  • 구체적 방법보다 무슨 일을 할 것인가? 를 기술한다.
  • 입력, 치환, 산술, 관계, 논리, 출력의 기본 기능 단위로 한번에 한가지만 키술한다.
  • 목적어 + 동사 형식으로 기술한다.
  • 처리단계 레벨은 되도록 3단계까지만 표현한다. (들여쓰기(인텐트) 3단계)
  • 한 줄의 하나의 행동만 적기, 위에서 아래 순서로 적기

이유

  • 체계적인 알고리즘은 복잡한 문제를 단순화시켜 줍니다.
  • 프로그램 설계와 코드 구성 단순화에 도움이 됩니다.
  • 빠른 버그 감지 및 수정이 가능합니다.
  • 협업 및 주석 작성이 용이합니다.

4. 코드 구현

설계한 알고리즘을 실제 코드로 구현하는 단계입니다.

이유

  • 요구사항 및 설계를 바탕으로 정확한 코드를 작성합니다.

예시

  • Python이나 Java 등 선호하는 프로그래밍 언어로 알고리즘을 구현합니다.

5. 에러 처리 작성

알고리즘 설계, 구현, 디버깅 단계 등에서 에러를 사전에 방지합니다.

이유

  • 함수의 일관성을 유지하고, 에러가 났다면 사용자가 알 수 있기 때문에 작성해주면 차별화를 일으킬 수 있습니다.

6. 테스트 및 디버깅

구현한 코드가 올바르게 작동하는지 확인하는 단계입니다.

  • 경계값 입력 : 최소/최대 길이 입력
  • 같은 조건 및 다른 세부 정보, 수열, 난수 반복 등
  • 결과를 예측한 테스트 케이스
  • 그 외 특정한 상황 정의 케이스

이유

  • 모든 경우에 대해 정확히 작동하는지 확인해야 합니다.

예시

  • 다양한 테스트 케이스를 만들어 실제 동작을 확인하고, 문제가 있으면 디버깅합니다.

7. 최적화

코드의 성능을 개선하는 단계입니다.

이유

  • 효율성을 높이면 더 큰 입력에도 빠르게 처리할 수 있습니다.

예시

  • 시간 복잡도를 줄이기 위해 더 나은 알고리즘을 찾아 적용합니다.

Chat GPT를 쓴다면

Chat GPT를 쓴다면 1차원적으로 던지고 끝나는 식이 아닌 '어떤 의도로 개발할 건데 너 생각은 어때?' 약간 이런 식으로 나의 의도에 대한 검증을 끝내고, 또 더 효율적인 의도를 배우는 것이 좋다.

또한 학습한 내용에 대해서 확인, 학습 정리를 작성해서 틀린 내용이 있는지 확인한다.

할 것들..

자료구조 관련

  1. 알고리즘 이론: 힙(Heap)

    • 우선순위 큐 구현
    • 힙 정렬
    • 최대/최소 힙
  2. 알고리즘 이론: 이진 탐색(Binary Search)

    • 이진 탐색 트리
    • 이진 탐색 응용
    • Lower/Upper Bound

문자열 처리

  1. 알고리즘 이론: 문자열
    • 문자열 매칭
    • KMP 알고리즘
    • 라빈-카프 알고리즘
    • 트라이(Trie) 자료구조

고급 알고리즘

  1. 알고리즘 이론: 분할 정복(Divide & Conquer)

    • 병합 정렬
    • 퀵 정렬
    • 응용 문제
  2. 알고리즘 이론: 투 포인터(Two Pointer)

    • 슬라이딩 윈도우
    • 구간 합
    • 부분 배열
  3. 알고리즘 이론: 백트래킹(Backtracking)

    • 순열과 조합
    • N-Queen 문제
    • 가지치기(Pruning)

고급 그래프

  1. 알고리즘 이론: 최단 경로

    • 다익스트라 알고리즘
    • 벨만-포드 알고리즘
    • 플로이드-워셜 알고리즘
  2. 알고리즘 이론: 최소 신장 트리

    • 크루스칼 알고리즘
    • 프림 알고리즘
    • Union-Find

최적화 & 실전

  1. 알고리즘 최적화 기법

    • 시간 복잡도 개선
    • 공간 복잡도 최적화
    • 메모이제이션
  2. 실전 문제 해결 전략

    • 문제 분석 방법
    • 알고리즘 선택 기준
    • 디버깅 전략
  3. 코딩 테스트 실전 팁

    • 시간 관리
    • 테스트 케이스 작성
    • 엣지 케이스 처리
profile
코뿔소처럼 저돌적으로

0개의 댓글