[C#]TIL (27) | 2023.08.30

kjg5370·2023년 8월 30일
0

TIL

목록 보기
27/91
post-thumbnail

들어가기 앞서

확실히 코드만으로 게임을 만든다는 것이 얼마나 힘든 일인지 팀 프로젝트를 진행하면서
많이 깨닫는 것 같습니다. 오늘은 데미지 같은 계산 쪽이 들어가는 기능들을 만드느라
훨씬 머리가 어지러웠습니다. C문법 교육시간도 거의 끝나가고 내일 팀프로젝트도
거의 마무리를 해야되기 때문에 오늘은 C#문법종합반 체크리스트에 있는 것들을 마무리 해보겠습니다.

오늘 배운 것

고급 알고리즘

  • 동적 프로그래밍 ( Dynamic Programming )
    복잡한 문제를 간단한 하위 문제로 나누어 푸는 알고리즘 설계 기법 중 하나.
    중복되는 하위 문제들을 한 번만 계산하고 그 결과를 메모리에 저장함으로써 계산 효율성을 높이는 방법.

    • 일반적인 접근 방식
      1. Top-down 방식 (메모이제이션 방식): 큰 문제를 작은 하위 문제들로 나눈 후, 작은 하위 문제들을 재귀적으로 푼 뒤 그 결과를 메모리에 저장하여 중복 계산을 피함.
      2. Bottom-up 방식 (타뷸레이션 방식): 작은 하위 문제부터 시작해서 큰 문제를 향해 진행하며, 작은 하위 문제들의 해결 결과를 반복적으로 계산하고 저장.
    • 피보나치 수열(Bottom-up 방식의 동적 프로그래밍을 사용)
      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 )
    최적해를 구하는 데 사용되는 알고리즘 디자인 패러다임 중 하나.
    각 단계에서 가장 좋아보이는 선택을 하며, 최종적으로 전역적인 최적해를 찾는 방법.

    • 작동 방식
      1. 선택 단계(Selection Phase): 현재 상태에서 가장 좋아보이는 선택을 함, 지역적으로는 최적이지만, 전역적으로 최적이라는 보장은 없음.
      2. 유효성 검사(Feasibility Check): 선택한 해가 문제의 조건을 만족하는지 검사.
      3. 해 검사(Solution Check): 선택한 해가 전역적인 최적해를 만족하는지 검사.
    • 거스름돈 줄이기 문제
        // 문제: 주어진 동전들로 특정 금액을 만드는데 필요한 최소 동전 수를 구하는 함수를 작성하세요.
      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 )
    문제를 더 작은 부분 문제로 나누어 해결하는 알고리즘 설계 기법.
    각 부분 문제는 독립적으로 해결되며, 그 결과를 조합하여 원래 문제의 해를 얻음.

    • 분할 정복 알고리즘의 일반적인 단계
      1. 분할(Divide): 주어진 문제를 작은 부분 문제로 분할.
      2. 정복(Conquer): 작은 부분 문제들을 재귀적으로 해결.
      3. 결합(Combine): 작은 부분 문제들의 해를 조합하여 원래 문제의 해를 구함.
    • 예시
      • 합병 정렬(Merge Sort) : 배열을 반으로 나눈 뒤, 각각을 재귀적으로 정렬하고 나중에 정렬된 부분을 병합하여 최종적으로 정렬된 배열을 얻는 방법
      • 퀵 정렬(Quick Sort) : 분할 정복 기법을 사용하여 배열을 정렬하는 빠르고 효율적인 알고리즘.
      • 이진 탐색(Binary Search) : 렬된 배열에서 특정 값을 찾는 알고리즘입니다. 배열을 중간에서 분할하면서 찾고자 하는 값과 비교하여 탐색 범위를 반으로 줄여나가는 방식으로 작동.

기억 할 것 & 진행 사항

문제 해결 전략

  1. 문제 이해 : 문제에서 요구하는 것을 명확히 파악하고, 제약 조건과 입력 형식을 이해.

  2. 예제와 테스트 케이스 : 문제의 예제와 추가적인 테스트 케이스를 활용하여 문제를 이해하고 해결 방법을 검증.

  3. 알고리즘 설계 : 문제의 특성에 맞는 적절한 알고리즘을 선택하고, 각 단계를 구체적으로 계획.

  4. 코드 작성 : 가독성을 높이고, 변수명을 명확하게 지어 코드의 의미를 이해하기 쉽게 만듬.

  5. 효율성 : 최적화 기법을 사용하여 코드의 성능을 향상시키고, 시간 복잡도와 공간 복잡도를 줄이는 방향으로 코드를 작성.

  6. 디버깅과 테스트 : 작성한 코드를 디버깅하여 오류를 찾고 수정, 다양한 테스트 케이스를 활용하여 코드의 정확성을 검증.

  7. 시간 관리 : 시간을 효과적으로 관리하고, 문제를 풀이하는 데 필요한 시간을 적절히 배분하는 능력 필요.

  8. 연습과 경험 : 다양한 유형의 문제를 풀고, 다른 사람들의 풀이를 학습하며 자신을 발전시키는 것.

  • 실전 연습문제 사이트
  1. 백준 온라인 저지 (https://www.acmicpc.net/)
  2. 프로그래머스 (https://programmers.co.kr/)
  3. 바킹독 (https://blog.encrypted.gg/)
  4. LeetCode (https://leetcode.com/)

현재 진행 사항

  • 체크리스트
    • 개발 환경 설정
    • 기본 코드 구조
    • 변수와 자료형
    • 연산자 문자열 처리
    • 조건문과 반복문
    • 배열과 컬렉션
    • 매서드와 구조체
    • 클래스와 객체
    • 상속과 다형성
    • 고급 문법 및 기능
    • 인터페이스와 열거형
    • 예외 처리 및 값형과 참조형
    • 델리게이트, 람다 및 LINQ
    • 고급 자료형 및 기능
    • 알고리즘 기초
    • 정렬 알고리즘
    • 탐색 알고리즘
    • 고급 알고리즘
    • 문제해결 전략과 실전 연습 ->! 정리 끝 !

내일 할 일

  • 하루 계획
    • 오전
      • 09:00 ~ 10:00 : 알고리즘 코드카타
      • 10:00 ~ 10:30 : 팀 회의
      • 10:30 ~ 14:00 :
        • 오늘 계획 (Task)
          • 팀 프로젝트
      • 12시-1시: 점심식사
    • 집중 코딩
      • 14:00 ~ 18:00
    • 저녁
      • 6시-7시: 저녁식사
      • 19:00 ~ 20:00 : 팀 프로젝트 마무리
      • 20:00 ~ 21:00: TIL 작성, 마무리 회고 진행
      • 21:00 : 내일은 위한 휴식!
profile
학생입니다

0개의 댓글