'프로그래밍/C#'에 해당되는 글 18건

  1. 2018.03.21 using , Dispose()
  2. 2018.03.15 퀵소트
  3. 2018.03.13 가중치 랜덤 생성
  4. 2018.03.11 이진탐색
  5. 2017.09.04 c# string으로 class 인스턴스 생성하기
  6. 2016.12.30 c# ref , out 키워드의 차이
  7. 2016.12.29 c++ 의 템플릿과 c#의 제네릭
  8. 2016.11.02 c# 개념에대해 정리가 잘된곳
프로그래밍/C#2018. 3. 21. 15:17
http://storycompiler.tistory.com/223?category=129476

 

'프로그래밍 > C#' 카테고리의 다른 글

Stack 구현  (0) 2018.03.21
try catch 성능  (0) 2018.03.21
퀵소트  (0) 2018.03.15
가중치 랜덤 생성  (0) 2018.03.13
이진탐색  (0) 2018.03.11
Posted by JinFluenza
프로그래밍/C#2018. 3. 15. 21:13
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
 
public class Test : MonoBehaviour
{
    void Start()
    {
        List<int> datas = new List<int>();
 
        for (int i = 0; i < 100; i++)
        {
            datas.Add(Random.Range(0, 100));
        }
 
        Quick(datas,0,datas.Count-1);
 
        for (int i = 0; i < datas.Count; i++)
        {
            Debug.Log(datas[i]);
        }
 
    }
 
    void Quick(List<int> datas,int left,int right)
    {
        int pL = left;
        int pR = right;
        int pivot = datas[(left+right)/2];
     
        while (pL <= pR)
        {
            while (datas[pL] < pivot) pL++;
            while (datas[pR] > pivot) pR--;
            if (pL <= pR)
            {
              SwapList(datas, pL, pR);
                pL++;
                pR--;
            }
        }
       
        if (left < pR) Quick(datas, left, pR);
        if (pL < right) Quick(datas, pL, right);
    }
 
    void SwapList(List<int> datas, int a, int b)
    {
        int temp = datas[a];
        datas[a] = datas[b];
        datas[b] = temp;
    }
 
 
 
 
}
 
cs

유니티에서 작성했다.

위와 같이 재귀로 구현하는 방법이 있고,재귀없이 스택을 활용해도 가능 한데, 퀵정렬 같은 경우에는

재귀 없이 짜는것 보다, 재귀가 훨씬 간결하고 깔끔한 것 같다.

재귀가 복잡하고 보기 어려운 것인줄만 알았는데,

이번 경우를 보면서 오히려 재귀가 더 간결하게 보일수도 있다는 것을 알게 됐다.

앞으로 재귀가 나온다고 해서 무작정 겁먹지 말지어다.ㅋㅋ


'프로그래밍 > C#' 카테고리의 다른 글

try catch 성능  (0) 2018.03.21
using , Dispose()  (0) 2018.03.21
가중치 랜덤 생성  (0) 2018.03.13
이진탐색  (0) 2018.03.11
c# string으로 class 인스턴스 생성하기  (0) 2017.09.04
Posted by JinFluenza
프로그래밍/C#2018. 3. 13. 21:21

1부터 n까지의 중에서 랜덤 값을 고르는 것은 쉽다

그냥 제공해주는 랜덤 함수를 사용하면 된다. (유니티의 경우는 Random.Range(1,n+1) 이정도.)

그런데 가중치를 적용해서 랜덤 숫자를 뽑는 것은 조금의 작업을 해줘야 한다.

예를 들어 1~5까지의 수가 있는데

1 가중치는 10

2 가중치는 20

3 가중치는 30

4 가중치는 40

5 가중치는 50

이런 식으로 가중치가 있을 수가 있다.

값들을 동일선상에 위치 시키고, 그 선상에 랜덤 피봇이 어디에 있는지를 확인한다는 원리를 활용하면 

가중치가 적용된 확률을 뽑을 수 있다.

게임 내에서 아이템들마다 생성 확률이 다를 사용 있겠다.

예전엔 다소 무식한 방법으로 처리를 했었는데.. 

이번에 면접을 보면서 문제로 나와서 다시 한번 작성 해봤다.


(Main함수는 확인용 코드고, GetRandom에 작성 했다. 두번째 인자인 seed값은 너무빨리 랜덤클래스를 만들면 난수가 제대로 생성되지 않는 문제를 해결하기 위해 넣었다. 짧은시간에 엄청난 양의 처리를 하지 않는다면 필요 없다.)



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
   class Program
    {
        static float GetRandom(float[] inputDatas, int seed)
        {
 
            Random random = new Random(seed);
 
            float total = 0;
 
            for (int i = 0; i < inputDatas.Length; i++)
            {
                total += inputDatas[i];
            }
 
            float pivot = (float)random.NextDouble() * total;
 
            for (int i = 0; i < inputDatas.Length; i++)
            {
                if (pivot < inputDatas[i])
                {
                    return inputDatas[i];
                }
                else
                {
                    pivot -= inputDatas[i];
                }
            }
            return inputDatas[inputDatas.Length - 1];
        }
 
        static void Main(string[] args)
        {
            Dictionary<floatint> datas = new Dictionary<floatint>();
 
            float[] probs = new float[] { 10f,20f,30f,40f,50f};
 
            int tryNum = 500000
 
            Random seedRnd = new Random();
            int startIndex = seedRnd.Next();
 
            for (int i = startIndex; i < startIndex+ tryNum; i++)
            {
                float returnValue = GetRandom(probs,i);
                if (datas.ContainsKey(returnValue) == false)
                {
                    datas.Add(returnValue, 1);
                }
                else
                {
                    datas[returnValue] ++;
                }
            }
 
            Console.WriteLine(string.Format("시행 횟수 : {0}",tryNum));
 
            List<float> keys = datas.Keys.ToList();
            keys.Sort();
 
            for(int i = 0; i < keys.Count; i++)
            {
                Console.WriteLine(string.Format("{0}이 {1}번 나옴 비율 : {2}%", keys[i], datas[keys[i]], ((float)datas[keys[i]] / (float)tryNum) * 100f));
            }                   
 
        }
     
 
    }
cs

결과

숫자마다 정확한 값이 나오지 않은 이유는 총 합이 100%를 넘기기 때문이다.

총 합이 100%라면 거의 근사한 값이 나올 것이다.

'프로그래밍 > C#' 카테고리의 다른 글

using , Dispose()  (0) 2018.03.21
퀵소트  (0) 2018.03.15
이진탐색  (0) 2018.03.11
c# string으로 class 인스턴스 생성하기  (0) 2017.09.04
c# ref , out 키워드의 차이  (0) 2016.12.30
Posted by JinFluenza
프로그래밍/C#2018. 3. 11. 19:08
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 static void BinarySearch(List<int> datas,int findNum)
        {
            //이진탐색은 정렬된 데이터만 가능하므로 정렬.
            datas.Sort();
 
            //성능측정용
            int counter = 0;
 
            int first = 0;
            int last = datas.Count - 1;        
 
            do
            {
                counter++;
                //중앙 인덱스
                int center = (first + last) / 2;             
 
                if (datas[center] == findNum)
                {
                    Console.WriteLine(string.Format("2진 : {0} 번만에 값 찾음", counter));
                    return;
                }
                if (datas[center] > findNum)
                {
                    last = center - 1;
                }
                else
                {
                    first = center + 1;
                }                               
            }
            while (first <= last);
 
            Console.WriteLine("2진 : {0} 번을 찾아보고 값이 없다는것을 알았다.", counter);
        }
    }
cs


List를 이용해 간단하게 binary search를 구현해 봤다.


간단하게 List Contains함수를 이용해 검색할 수도 있지만, Contains함수는 시간 복잡도가 O(n)이라고 한다.


물론 binary search가 훨씬 빠르긴 하지만 데이터들이 반드시 정렬이 되어 있어야 한다는 조건이 붙는다.


정렬비용과 검색비용을 고려해서 잘 사용해야 할 것 같다.


list에는 이미 BinarySearch 라는 함수가 구현이 되어 있기 때문에 굳이 구현 할 필요 없이 쓰면 될 것 같다.

'프로그래밍 > C#' 카테고리의 다른 글

퀵소트  (0) 2018.03.15
가중치 랜덤 생성  (0) 2018.03.13
c# string으로 class 인스턴스 생성하기  (0) 2017.09.04
c# ref , out 키워드의 차이  (0) 2016.12.30
c++ 의 템플릿과 c#의 제네릭  (0) 2016.12.29
Posted by JinFluenza
프로그래밍/C#2017. 9. 4. 18:11

namespace ConsoleApplication5
{
    class Test
    {   
        public void Print()
        {
            Console.WriteLine("?");
        }
    }


    class Program
    {
        static void Main(string[] args)
        {

                                               //네임스페이스.클래스명
            Type type = Type.GetType("ConsoleApplication5.Test");
            Test instance = Activator.CreateInstance(type) as Test;
            instance.Print();

        }    
    }
}

 

'프로그래밍 > C#' 카테고리의 다른 글

가중치 랜덤 생성  (0) 2018.03.13
이진탐색  (0) 2018.03.11
c# ref , out 키워드의 차이  (0) 2016.12.30
c++ 의 템플릿과 c#의 제네릭  (0) 2016.12.29
c# 개념에대해 정리가 잘된곳  (0) 2016.11.02
Posted by JinFluenza
프로그래밍/C#2016. 12. 30. 22:47

일단 둘의 공통점은 둘다 레퍼런스 타입 이라는 것. 그리고 사용 목적이 비슷하다는 점.(둘다 메소드 내에서 어떤 값을 처리하는 용도.)


둘의 차이점은 

ref는 주로 메소드 내에서 원래 있던 값을 수정하고자 할 때 사용한다.

따라서 메소드 수행 전 해당 변수값이 미리 초기화가 되어 있어야 하고.


out는주로 메소드 내에서 생성된 새로운 값을 반환해 사용하고자 할 때 사용한다. 

따라서 해당 변수가 미리 초기화 되어 있을 필요는 없고.              

선언만 되어있는 상태여도 작동한다. 하지만 메소드 안에서 해당 값을 반드시 할당 해 주어야 한다.

'프로그래밍 > C#' 카테고리의 다른 글

가중치 랜덤 생성  (0) 2018.03.13
이진탐색  (0) 2018.03.11
c# string으로 class 인스턴스 생성하기  (0) 2017.09.04
c++ 의 템플릿과 c#의 제네릭  (0) 2016.12.29
c# 개념에대해 정리가 잘된곳  (0) 2016.11.02
Posted by JinFluenza
프로그래밍/C#2016. 12. 29. 10:43

http://blog.secmem.org/192

'프로그래밍 > C#' 카테고리의 다른 글

가중치 랜덤 생성  (0) 2018.03.13
이진탐색  (0) 2018.03.11
c# string으로 class 인스턴스 생성하기  (0) 2017.09.04
c# ref , out 키워드의 차이  (0) 2016.12.30
c# 개념에대해 정리가 잘된곳  (0) 2016.11.02
Posted by JinFluenza
프로그래밍/C#2016. 11. 2. 18:37

http://mrw0119.tistory.com

 

http://blog.eairship.kr/145

요기에 c# 카테고리에 들어가보면 설명이 친절하게 잘 되어있습니다.

'프로그래밍 > C#' 카테고리의 다른 글

가중치 랜덤 생성  (0) 2018.03.13
이진탐색  (0) 2018.03.11
c# string으로 class 인스턴스 생성하기  (0) 2017.09.04
c# ref , out 키워드의 차이  (0) 2016.12.30
c++ 의 템플릿과 c#의 제네릭  (0) 2016.12.29
Posted by JinFluenza