알고리즘 문제를 풀 때, 체계적으로 접근하면 효율적이고 효과적으로 문제를 해결할 수 있다.
1. 상세 요구사항 이해
제일 중요한 부분, 시간을 써도 되니 글로 써보자
상세 요구사항을 분석하고, 작성하는 단계입니다.
문제의 본질을 명확히 이해하는 것은 해결책을 찾는 첫 걸음입니다.
작성법
예시는 Algorithm 240702 글을 보면 된다.
- 문제 정의 : 문제를 읽고 이해하기 위해 문제의 본질을 간단명료하게 정의.
- 주요 기능 및 요구사항
- 기능 목록 : 시스템이 제공해야 하는 주요 기능을 나열.
- 각 기능에 대해 상세한 요구사항을 기술.
- 요구사항 간의 상관관계를 파악하고 기술.
- 제약 조건 : 시스템 구현 시 고려해야 할 제약 조건을 기술.
- 예외 처리 : 발생할 수 있는 예외 상황과 그에 대한 처리를 정의.
Use Case
알고리즘 중에 너무 어려운 나머지 구조를 모르겠다면 Use Case를 적용시켜봅니다.
- Use Case 이름 : 각 유스케이스의 명칭을 정의.
- 행위자(Actor) : 시스템과 상호작용하는 사용자 또는 다른 시스템을 정의.
- 사전 조건 : 유스케이스가 실행되기 전에 충족되어야 하는 조건.
- 기본 흐름 : 유스케이스가 정상적으로 수행될 때의 단계별 시나리오.
- 대체 흐름 : 기본 흐름에서 벗어나는 경우의 시나리오.
- 사후 조건 : 유스케이스가 완료된 후 시스템의 상태.
이유
- 문제를 잘못 이해하면 엉뚱한 방향으로 접근할 수 있습니다.
- 잘못 이해한 채로 문제를 풀면 오히려 시간이 더 걸릴 수도 있습니다.
- 명확한 요구사항 정의는 해결책의 방향성을 제시합니다.
예시
- 배열에서 특정 숫자의 위치를 찾는 문제"라면, 주어진 배열이 정렬되어 있는지, 중복된 숫자가 있는지 등을 파악합니다.
2. 입출력 분석
입력과 출력의 형식을 이해하는 것은 코드 작성의 기본입니다.
보통 요구사항을 분석하며 같이 쓸 수도 있습니다.
이유
- 입력의 조건과 출력의 형식을 제대로 이해해야 정확한 코드를 작성할 수 있습니다.
예시
- 입력이 "n개의 숫자"라면, 이를 어떻게 받을지, 출력은 무엇을 어떻게 해야 할지 명확히 정의합니다.
- 예제 케이스 분석도 하면서 문제의 주요 사항들을 테스트하면 더 이해하기 좋습니다.
3. 의사코드 작성(알고리즘 설계)
문제 해결을 위한 명확한 절차를 정의하는 단계입니다.
알고리즘, 코드 등을 구현하고 이해하기 편하게 일련의 규칙에 따라 인간의 언어로 작성한 기록물입니다.
작성법
- 구체적 방법보다 무슨 일을 할 것인가? 를 기술한다.
- 입력, 치환, 산술, 관계, 논리, 출력의 기본 기능 단위로 한번에 한가지만 키술한다.
- 목적어 + 동사 형식으로 기술한다.
- 처리단계 레벨은 되도록 3단계까지만 표현한다. (들여쓰기(인텐트) 3단계)
- 한 줄의 하나의 행동만 적기, 위에서 아래 순서로 적기
이유
- 체계적인 알고리즘은 복잡한 문제를 단순화시켜 줍니다.
- 프로그램 설계와 코드 구성 단순화에 도움이 됩니다.
- 빠른 버그 감지 및 수정이 가능합니다.
- 협업 및 주석 작성이 용이합니다.
4. 코드 구현
설계한 알고리즘을 실제 코드로 구현하는 단계입니다.
이유
- 요구사항 및 설계를 바탕으로 정확한 코드를 작성합니다.
예시
- Python이나 Java 등 선호하는 프로그래밍 언어로 알고리즘을 구현합니다.
5. 에러 처리 작성
알고리즘 설계, 구현, 디버깅 단계 등에서 에러를 사전에 방지합니다.
이유
- 함수의 일관성을 유지하고, 에러가 났다면 사용자가 알 수 있기 때문에 작성해주면 차별화를 일으킬 수 있습니다.
6. 테스트 및 디버깅
구현한 코드가 올바르게 작동하는지 확인하는 단계입니다.
- 경계값 입력 : 최소/최대 길이 입력
- 같은 조건 및 다른 세부 정보, 수열, 난수 반복 등
- 결과를 예측한 테스트 케이스
- 그 외 특정한 상황 정의 케이스
이유
- 모든 경우에 대해 정확히 작동하는지 확인해야 합니다.
예시
- 다양한 테스트 케이스를 만들어 실제 동작을 확인하고, 문제가 있으면 디버깅합니다.
7. 최적화
코드의 성능을 개선하는 단계입니다.
이유
- 효율성을 높이면 더 큰 입력에도 빠르게 처리할 수 있습니다.
예시
- 시간 복잡도를 줄이기 위해 더 나은 알고리즘을 찾아 적용합니다.
Chat GPT를 쓴다면
Chat GPT를 쓴다면 1차원적으로 던지고 끝나는 식이 아닌 '어떤 의도로 개발할 건데 너 생각은 어때?' 약간 이런 식으로 나의 의도에 대한 검증을 끝내고, 또 더 효율적인 의도를 배우는 것이 좋다.
또한 학습한 내용에 대해서 확인, 학습 정리를 작성해서 틀린 내용이 있는지 확인한다.
할 것들..
자료구조 관련
-
알고리즘 이론: 힙(Heap)
-
알고리즘 이론: 이진 탐색(Binary Search)
- 이진 탐색 트리
- 이진 탐색 응용
- Lower/Upper Bound
문자열 처리
- 알고리즘 이론: 문자열
- 문자열 매칭
- KMP 알고리즘
- 라빈-카프 알고리즘
- 트라이(Trie) 자료구조
고급 알고리즘
-
알고리즘 이론: 분할 정복(Divide & Conquer)
-
알고리즘 이론: 투 포인터(Two Pointer)
-
알고리즘 이론: 백트래킹(Backtracking)
- 순열과 조합
- N-Queen 문제
- 가지치기(Pruning)
고급 그래프
-
알고리즘 이론: 최단 경로
- 다익스트라 알고리즘
- 벨만-포드 알고리즘
- 플로이드-워셜 알고리즘
-
알고리즘 이론: 최소 신장 트리
- 크루스칼 알고리즘
- 프림 알고리즘
- Union-Find
최적화 & 실전
-
알고리즘 최적화 기법
- 시간 복잡도 개선
- 공간 복잡도 최적화
- 메모이제이션
-
실전 문제 해결 전략
- 문제 분석 방법
- 알고리즘 선택 기준
- 디버깅 전략
-
코딩 테스트 실전 팁
- 시간 관리
- 테스트 케이스 작성
- 엣지 케이스 처리