대외활동/starters 부트캠프 feat.웅진씽크빅

[유데미] "쉽게 배우는 C# 알고리즘 입문" 리뷰

Heeyeon Choi 2022. 7. 17. 08:56
728x90

최근에 c#에 대해 공부하면서, "알고리즘"에 관심이 생겼습니다. 

기본적인 문법 말고, 알고리즘에 대해서만 알려줄 강의가 없나 찾아봤습니다. 

프로그래밍 관련한 인기 인강 사이트인 "유데미" 에서 c# 알고리즘을 검색하니,

"쉽게 배우는 C# 알고리즘 입문" 강의가 추천으로 나왔습니다. 

 

강의도 "9시간"정도 밖에 안되고, 기초 알고리즘부터 심화 알고리즘까지 잘 정리되어 있어 수강신청을 했습니다. 

 

<목차>


[HD]쉽게 배우는 C# 알고리즘 프로그래밍 Part.1

  • 알고리즘(Algorithm)과 절차 지향 프로그래밍 강의 소개
  • 학습할 알고리즘 리스트 및 강의 소스 다운로드 등 소개
  • 참고_알고리즘 학습 환경 구축_닷넷 개발자를 위한 Visual Studio 설치
  • 합계 알고리즘(Sum Algorithm)
  • 디버거를 사용하여 디버깅하기_C#
  • 알고리즘_등차수열_홀수의 합
  • 개수 알고리즘(Count Algorithm)
  • 알고리즘_소수 구하기
  • 알고리즘_소수_개수_소수 개수 구하기
  • PerfectNumber_알고리즘_완전수 및 완전수 개수 구하기
  • 평균 알고리즘(Average Algorithm)
  • 알고리즘_평균 이상 학생수 구하기
  • 참고_이차원 배열을 사용하여 점수에 대한 합계와 평균을 구하기

 

[HD]쉽게 배우는 C# 알고리즘 프로그래밍 Part.2

  • 최댓값 알고리즘(Max Algorithm)
  • 최솟값 알고리즘(Min Algorithm)
  • 알고리즘_최댓값과 최솟값 제외한 평균값 구하기
  • 근삿값 알고리즘(Near Algorithm)
  • NearAll_알고리즘_가까운값 모두 구하기
  • 순위 알고리즘(Rank Algorithm)
  • 정렬 알고리즘(Sort Algorithm)
  • 검색 알고리즘(Search Algorithm)
  • 병합 알고리즘(Merge Algorithm)
  • 최빈값 알고리즘(Mode Algorithm)
  • 그룹 알고리즘(Group Algorithm)
728x90

 


컴퓨터공학과를 전공한 쓰니는 Part.1 내용은 이미 알고 있지만, 그래도 한번 정리해두면 좋을 것 같아서 Part.1부터 수강하였습니다. 

현재 PerfectNumber_알고리즘_완전수 및 완전수 개수 구하기 까지 수강하였는데, 생각보다 쉽지만은 않아서 도움이 되었습니다. 

 

 합계 알고리즘(Sum Algorithm)

: 주어진 범위에 주어진 조건에 해당하는 자료들의 합계

 

합계 알고리즘 파트에서는 "n명의 국어 점수 중에서 80점 이상인 점수의 합계"  를 공부했습니다. 

//[?] n명의 국어 점수 중에서 80점 이상인 점수의 합계
using System;
using System.Text;

namespace 쉽게_배우는_csharp_알고리즘_입문
{
/// <summary>
/// 합계 알고리즘(Sum Algorithm): 주어진 범위에 주어진 조건에 해당하는 자료들의 합계
/// </summary>
    class SumAlgorithm
    {

        static void Main()
        {
            //[1]input: n명의 국어 점수
            int[] scores = { 100, 75, 50, 37, 90, 95};
            int sum = 0;

            //[2]process: 합계 알고리즘 영역: 주어진 범위에 주어진 조건(필터링)
            for(int i = 0; i < scores.Length; i++)
            {
                if (scores[i]>=80)
                {
                    sum += scores[i]; //SUM
                }
            }

            //[3]output
            Console.WriteLine($"{scores.Length}명의 점수 중 80점 이상의 총점: {sum}");

          
        }
    }
}

input, process, output 3단계로 나눠서 코드를 작성하였습니다. 

알고리즘을 공부하기 위해, 위와 같이 코드를 작성하였지만, 실무에서는 어떤식으로 작성하는지도 배웠습니다.

 

<실무버전>

(new int[]{ 100, 75, 50, 37, 90, 95}).Where(s=> s>=80).Sum()//statement-> Expression
285

실무에서는 statement를 expression으로 작성한다고 합니다. 물론 저희는 아직 학생 개발자, 즉 배우는 사람들이니 이론버전으로 작성하는것이 올바릅니다. 

 

디버거 사용법

: F9->F5->F11->F5

F9로 중단점을 설정하고 F5로 중단점부터 디버깅을 시작하고 F11로 코드 한 줄 씩 디버깅을 하고 다 끝난후 F5로 결과도출후 종료하면 됩니다. 지금까지 코딩을 하면서 디버깅을 제대로 해본적이 없어서, 이번기회에 제대로 배웠습니다. 

 

 등차수열(Arithmetic Sequence) - 홀수의 합

: 연속하는 두 수의 차이가 일정한 수열

 

등차수열 알고리즘에서는 1부터 20까지의 정수 중 홀수의 합을 구하는 프로그램에 대해 공부했습니다.

 

//[?] 1부터 20까지의 정수 중 홀수의 합을 구하는 프로그램
//1,3,5,7,9.....
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Project2
{
    /// <summary>
    /// 등차수열(Arithmetic Sequence):연속하는 두 수의 차이가 일정한 수열
    /// </summary>
    class ArithmeticSequence
    {
        static void Main()
        {
            //[1]input
            var sum = 0; 

            //[2]process
            for(int i =1; i <= 20; i++) //주어진 범위
            {
                if(i%2 !=0) //주어진 조건: 필터링(홀수)
                {
                    sum += i; //SUM
                    Console.WriteLine("{0,2} ", i);
                }
            }

            //[3]output
            Console.WriteLine($" \n 1부터 20까지의 홀수의 합: {sum}");
        }
    }
}

 

개수 알고리즘(Count Algorithm)

:주어진 범위에 주어진 조건에 해당하는 자료들의 개수

 

개수 알고리즘(Count Algorithm)에서는 1부터 1,000까지의 정수 중 13의 배수의 개수를 세는 알고리즘에 대해 공부했습니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//[?]1부터 1,000까지의 정수 중 13의 배수의 개수
namespace Project2
{
    class CountAlgorithm
    {/// <summary>
    /// 개수 알고리즘(Count Algorithm):주어진 범위에 주어진 조건에 해당하는 자료들의 개수
    /// </summary>
        static void Main()
        {
            //[1] Input: 1부터 1000까지의 데이터
            var numbers = Enumerable.Range(1, 1_000).ToArray(); //Linq 사용
            int count = default; //개수를 저장할 변수는 0으로 초기화

            //[2] Process : 개수 알고리즘 영역: 주어진 범위에 주어진 조건(필터링)
            for(int i = 0; i < numbers.Length; i++)
            {
                if (numbers[i]%13 ==0)
                {
                    count ++;
                }
            }
            //[3] Output
            Console.WriteLine($"1부터 1,000까지의 정수 중 13의 배수의 개수: 76");

        }
    }
}

<실무버전>

Enumerable.Range(1, 1_000).ToArray().Where(n => n % 13 == 0).Count()
76

Enumerable.Range(1, 1_000).ToArray().Count(n => n % 13 == 0)
76

 

소수(Prime Number)

: 자연수 중에서 1과 자기 자신만을 약수로 가지는 자연수 

 

소수구하기 알고리즘에서는 특정 수를 입력 받아서, 소수인지 아닌지 판별하는 프로그램을 공부했습니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//[?]특정 수를 입력 받아서, 소수인지 아닌지 판별하는 프로그램
// 5 는 소수:1과 5만을 약수로 가짐
// 6은 소수가 아님: 1과 6만이 아닌 추가로 2와 3을 약수로 가짐
// 2부터 해당 수까지 나머지값을 구해서 나머지값이 0일때 나눈 수가 해당 수라면 소수
namespace PrimeNumber
{/// <summary>
/// 소수(Prime Number): 자연수 중에서 1과 자기 자신만을 약수로 가지는 자연수 
/// </summary>
    internal class PrimeNumber
    {
        static void Main(string[] args)
        {
            //[1]Input
            var number = 0;
            Console.Write("수 입력: _\b");
            number = Convert.ToInt32(Console.ReadLine());
            //[2]process:Prime Number: 2부터 n까지 나누어 떨어지는 수가 발생할 때까지 반복
            var i = 1;
            do
            {
                i ++; //2부터 n까지 비교
                Console.WriteLine($"{number}%{i} = {number%i}");

            } while (number % i !=0);
            //[3]output
            if (number == i)
            {
                Console.WriteLine("소수");
            }
            else
            {
                Console.WriteLine("소수 아님");
            }
        }
    }
}

 

소수(Prime Number)개수(Count) 구하기

소수 개수구하기에서는 정수 하나를 입력받아, 2부터 해당 수까지에 존재하는 모든 소수를 찾아서 출력하는 것에 대해 공부했습니다. 

예를 들어, 2~10까지의 정수: 소수는 2,3,5,7-> 4개 입니다. 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//[?]정수 하나를 입력받아, 2부터 해당 수까지에 존재하는 모든 소수를 찾아서 출력
//예: 2~10까지의 정수: 2,3,5,7-> 4개
namespace Project2
{/// <summary>
/// 소수(Prime Number)개수(Count) 구하기
/// </summary>
    internal class PrimeNumberCount
    {
        static void Main()
        {
            //[1] Input
            var count = 0; //소수 개수
            var sw = true; //소수인지를 확인하는 스위치 변수(flag)
            var number = 0; //2~number까지의 수 중 소수를 구함
            Console.WriteLine("수 입력: _\b"); 
            number = Convert.ToInt32(Console.ReadLine());

            //[2] process: Prime Number -> Count
            for(int i = 2; i < number; i++)
            {
                sw = true; //일단 모든 반복마다 소수로 놓고 시작
                //2부터 현재수(i) - 1 까지 나누었을 때 나누어 떨어지면 소수가 아님
                for(int j=2; j<i; j++)
                {
                    if(i%j == 0)
                    {
                        sw = false;
                        break;
                    }
                }
                //소수일 경우
                if (sw)
                {
                    Console.Write($"{i}\t");
                    count++; //COUNT

                    if (count % 5 == 0)
                    {
                        Console.WriteLine(); //줄바꿈
                    }
                }
            }
            //[3] output
            Console.WriteLine($"\n2부터 {number}까지의 소수의 개수:{count}");
        }
    }
}

 

완전수

: 자신을 제외한 약수의 합이 자신과 같은 수

 

알고리즘 완전수에서는 1부터 10000까지의 완전수와 개수를 출력하는 것을 공부했습니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//알고리즘_완전수: 자신을 제외한 약수의 합이 자신과 같은 수
// 6= 1+2+3
//1부터 10000까지의 완전수와 개수를 출력
namespace Project2
{
    internal class Algorithm_PerfectNumber
    {
        static void Main()
        {
            int sum = 0; //약수의 합계
            int cnt = 0;//완전수의 개수
            int max = 0; //가장 큰 약수
            int rem = 0; //나머지값 임시 보관

            for(int i = 1; i <= 10000; i++)
            {
               sum = 0; //매 반복마다 0으로 초기화 
               max = i/2; //모든 짝수를 2로 나누면 가장 큰 약수를 구할 수 있다.
               for(int j=1; j<=max; j++)
                {
                    rem = i-(i/j)*j; //자신 % 약수
                    if (rem == 0)
                    {
                        sum += j; //약수의 합계
                    }
                }
                if (i == sum) //자신== 약수의 합계 => 완전 수
                {
                    Console.WriteLine("완전수:{0}", i);
                    cnt++;
                }
            }

            Console.WriteLine("완전 수 개수:{0}", cnt);
        }
    }
}

1부터 10000까지의 for 루프안에서 1부터 i를 2로 나눈 수까지로 나눈 값를 검사합니다. 

이때 만약 나머지값이 0이라면 sum변수에 저장합니다. (약수이기 때문에)

i의 값과 sum의 값이 같다면 완전 수로 판정하여 출력합니다. 그리고 완전 수일 경우, cnt 변수를 하나씩 증가시켜 마지막에 출력합니다.

 


이렇게, 아직은 5개의 알고리즘에 대해서만 공부해봤습니다. 짧은 시간동안 많은 것을 배울 수 있어, 효율적인 공부를 할 수 있었습니다. 앞으로 남은 알고리즘도 추후에 정리하여 올려보겠습니다. ^^ 

 


아직까지 유데미강의를 하나밖에 들어보지 못했지만, 유데미에는 좋은 강의가 많은 것 같습니다. 

현재 제가 듣고 있는 "쉽게 배우는 C# 알고리즘 입문" 강의는 c#을 제대로 공부해보고 싶은 사람이라면 한번쯤 들으면 좋을 것 같습니다.

 

유데미 사이트에는 수많은 강의가 존재하는데, 유니티 관련된 강의가 많습니다. 유니티에 관심이 있고, 입문하고 싶다면 

따라하면서 배우는 고박사의 유니티 기초 [Part 01][유니티 기초]
따라하면서 배우는 고박사의 유니티 기초 [Part 02][유니티 2D 기초]
따라하면서 배우는 고박사의 유니티 기초 [Part 03][유니티 3D 기초]

순으로 들은 후 다른 강의를 듣는 것을 추천합니다~

세 가지 다 들어도 약 5시간 정도밖에 소요되지 않습니다ㅎㅎ 도전해보시길 바랍니다. 


앞으로 유데미 콘텐츠를 더 많이 수강하고 후기 올리도록 하겠습니다^0^ 

 

 

——————————————————————————

유데미코리아 바로가기 : https://bit.ly/3b8JGeD

본 포스팅은 유데미-웅진씽크빅 취업 부트캠프 유니티 1기 과정 후기로 작성되었습니다.

728x90