동적 프로그래밍 ( Dynamic Programming )
복잡한 문제를 간단한 하위 문제로 나누어 푸는 알고리즘 설계 기법 중 하나.
중복되는 하위 문제들을 한 번만 계산하고 그 결과를 메모리에 저장함으로써 계산 효율성을 높이는 방법.
using System; class DynamicExample { // 동적 프로그래밍을 이용한 피보나치 수열 구현 static int Fibonacci(int n) { int[] fibArray = new int[n + 1]; fibArray[0] = 0; fibArray[1] = 1; for (int i = 2; i <= n; i++) { fibArray[i] = fibArray[i - 1] + fibArray[i - 2]; } return fibArray[n]; } static void Main(string[] args) { int n = 10; // 계산할 피보나치 수열의 항 번호 int result = Fibonacci(n); Console.WriteLine($"Fibonacci({n}) = {result}"); } }
그리디 알고리즘 ( Greedy Algorithm )
최적해를 구하는 데 사용되는 알고리즘 디자인 패러다임 중 하나.
각 단계에서 가장 좋아보이는 선택을 하며, 최종적으로 전역적인 최적해를 찾는 방법.
// 문제: 주어진 동전들로 특정 금액을 만드는데 필요한 최소 동전 수를 구하는 함수를 작성하세요. public int MinCoins(int[] coins, int amount) { Array.Sort(coins); int count = 0; for(int i = coins.Length - 1; i >= 0; i--) { while(amount >= coins[i]) { amount -= coins[i]; count++; } } if(amount > 0) return -1; return count; }
분할 정복 ( Divide and Conquer )
문제를 더 작은 부분 문제로 나누어 해결하는 알고리즘 설계 기법.
각 부분 문제는 독립적으로 해결되며, 그 결과를 조합하여 원래 문제의 해를 얻음.
문제 이해 : 문제에서 요구하는 것을 명확히 파악하고, 제약 조건과 입력 형식을 이해.
예제와 테스트 케이스 : 문제의 예제와 추가적인 테스트 케이스를 활용하여 문제를 이해하고 해결 방법을 검증.
알고리즘 설계 : 문제의 특성에 맞는 적절한 알고리즘을 선택하고, 각 단계를 구체적으로 계획.
코드 작성 : 가독성을 높이고, 변수명을 명확하게 지어 코드의 의미를 이해하기 쉽게 만듬.
효율성 : 최적화 기법을 사용하여 코드의 성능을 향상시키고, 시간 복잡도와 공간 복잡도를 줄이는 방향으로 코드를 작성.
디버깅과 테스트 : 작성한 코드를 디버깅하여 오류를 찾고 수정, 다양한 테스트 케이스를 활용하여 코드의 정확성을 검증.
시간 관리 : 시간을 효과적으로 관리하고, 문제를 풀이하는 데 필요한 시간을 적절히 배분하는 능력 필요.
연습과 경험 : 다양한 유형의 문제를 풀고, 다른 사람들의 풀이를 학습하며 자신을 발전시키는 것.
백준 온라인 저지
(https://www.acmicpc.net/)프로그래머스
(https://programmers.co.kr/)바킹독
(https://blog.encrypted.gg/)LeetCode
(https://leetcode.com/)09:00 ~ 10:00 : 알고리즘 코드카타
10:00 ~ 10:30 : 팀 회의
10:30 ~ 14:00 :
12시-1시: 점심식사
14:00 ~ 18:00
6시-7시: 저녁식사
19:00 ~ 20:00 : 팀 프로젝트 마무리
20:00 ~ 21:00: TIL 작성, 마무리 회고 진행
21:00 : 내일은 위한 휴식!