'프로그래밍'에 해당되는 글 111건

  1. 2018.03.21 using , Dispose()
  2. 2018.03.15 퀵소트
  3. 2018.03.15 정렬알고리즘 속도 비교
  4. 2018.03.15 for문
  5. 2018.03.14 c++매크로에서 while(0)사용하는 이유
  6. 2018.03.13 가중치 랜덤 생성
  7. 2018.03.11 이진탐색
  8. 2018.03.09 좌표계 (직교,극)
  9. 2017.12.14 unity sprite outlineShader
  10. 2017.12.08 안드로이드 인증서 지문 구하는법
프로그래밍/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
프로그래밍/기타2018. 3. 15. 21:05

https://www.toptal.com/developers/sorting-algorithms/


이 사이트에 가보면 정렬되는 과정, 속도를 알고리즘 별로 확인 가능하다.

'프로그래밍 > 기타' 카테고리의 다른 글

vs 단축키  (0) 2018.12.14
unity svn ignore  (0) 2018.05.20
IOS cocoapods  (0) 2018.05.12
Visualgo  (0) 2018.03.26
for문  (0) 2018.03.15
Posted by JinFluenza
프로그래밍/기타2018. 3. 15. 06:42

책을 보다 보니까 약간 특이한 형태의 for문이 있었다.



1
2
3
4
5
6
7
8
9
10
11
12
13
   void insertion(int a[])
   {
       int i, j;
       for (i = 1; i < a.Length; i++)
       {
           int tmp = a[i];
           for (j = i; j > 0 && a[j - 1> tmp; j--)
           {
               a[j] = a[j - 1];
           }
           a[j] = tmp;
       }
   }
cs


요것이다. 


간단한 삽입 정렬 코드 인데

 

일반적으로 사용하는 for문과는 약간 생김새가 다르다

 

1. i,j변수를 외부에 선언했다

 

2.두번째 for문에서 가운데 반복 조건 처리를 j>0 && a[j-1]>tmp 이렇게 두가지를 했다.

 

위에 코드는 어떻게 보면 깔끔하고 세련됐다고 볼 수도 있겠지만,


가독성 면에서는 불편하다는 생각이 들었다. 특히 두번째 포문의 탈출조건


충분히 안쪽에서 포문을 나가게 할 수 있는데 굳이 저렇게 조건을 중첩 시켜야 했나 싶다.


밑에 코드는 내가 다시 작성해본 코드인데 위에 코드와 결과가 같다.


반복 횟수를 카운트 해봤는데 반복 횟수 또한 같았다.

(i++,j--뒤에 count변수를 넣어서 테스트 해봤다.)


내 기준으로는 밑에 코드가 조금 더 이해 하기 쉽다고 생각하는데

 

혹시라도 내가 놓친 부분이 있거나, 틀린 생각을 하고 있는 것인지 다른 사람들 의견을 들어보면 좋을것 같다.


일단 새벽에 뻘짓 하지 말고 잠이나 자야 겠다. .zZ

 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 void myInsertion(int[] a)
   {        
       for (int i = 1; i < a.Length; i++)
       {
           for(int j = i; j > 0; j--)
           {
               if (a[j - 1> a[j])
               {
                   int temp = a[j - 1];
                   a[j - 1= a[j];
                   a[j] = temp;
               }
               else
                   break;                   
           }
       }
      
   }
cs



'프로그래밍 > 기타' 카테고리의 다른 글

vs 단축키  (0) 2018.12.14
unity svn ignore  (0) 2018.05.20
IOS cocoapods  (0) 2018.05.12
Visualgo  (0) 2018.03.26
정렬알고리즘 속도 비교  (0) 2018.03.15
Posted by JinFluenza
프로그래밍/C++2018. 3. 14. 18:11


꼼수다.

http://blog.dasomoli.org/220/

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
프로그래밍/수학2018. 3. 9. 20:43

1.직교 좌표계(orthogonal coordinate system)


좌표계는 물체의 위치를 특정한 하나의 점으로 유일하게 가리키기 위한 체계다.


우리가 흔히 알고 있는 원점에서 직각으로 교차 하는 x축,y축으로 구성된 좌표계를 직교좌표계 라고 한다.

(데카르트 좌표계 라고 부르기도 함)




위와 같은 형태의  좌표계는 2차원 평면상의 위치를 표현하기에 알맞고 많이 사용된다.



(사진 출처 : http://msdn.microsoft.com/en-us/library/windows/apps/ff729721.aspx)


여기에 z축만 추가하게 되면 3차원상의 위치 표현이 가능해진다.


그리고 z축의 방향이 앞으로 향하느냐 뒤로 향하느냐에 따라서 


왼손좌표계,오른손좌표계로 나뉘기도 한다.


주로 directX진형에서는 왼손좌표계가 기본으로 사용되고, 


OpenGL 진영에서는 오른손 좌표계를 사용한다고 함.


가장 기본적인 좌표 체계이다.



2.극좌표계 (polar coordinate system)


한편 직교좌표계와는 다른 방식으로 위치를 나타내는 좌표계도 존재한다. 

그 대표적인 좌표계가 극 좌표계 이다. (polar coordinate system)



극 좌표계에서 평면상의 점의 위치를 결정하는 것은 극(기준점 O)과 극축(x축)을 기준으로한 반지름의 길이와 각도 이다.


극좌표계에서 저 빨간 점을 x,y로 표현한다면, 극좌표계에서는 r,θ(반지름 각도) 로 읽는다.


삼각함수의 원리를 이용하면 극좌표를 직교좌표로 표현할수 있는데.

극좌표 (r,θ)는 직교좌표 (r * cosθ , r * sinθ)와 같다.

반대로

직교좌표 (x,y)는 극좌표 (x^2+y^2 , atan2(y,x)) 와 같다.


극좌표는 평면상에서 원의 원주 위를 이동시킨 다던지 행동을 할때 활용하면

직관적으로 처리가 쉬워진다.


직교좌표계에 z축을 추가해서 3차원 공간을 표현하는 것 처럼.

극좌표계도 마찬가지로 축을 하나 더 추가하면 3D극좌표계를 정의할 수 있다.

이러한 3D극좌표계를 특별히 구면좌표계 라고 부른다.


(사진 출처 : https://www.celestis.com/resources/faq/what-are-the-azimuth-and-elevation-of-a-satellite/)


Azimuth(방위각)  : 북의 방향과 물체(노란공)이 이루는 각도

Elevation(앙각) : 천정(Zenith)을 향해 물체(노란공)이 고도를 높여 이동한 각도

대표적인 사용 예로는 지구본을 떠올리면 쉽다. (경도,위도)



게임내에서는 구면을 이동하는 물체(지구를 빙빙 도는 위성)을 표현하거나.

3인칭 시점의 카메라를 구현하는데 활용하면 좋다.



유니티에서의 구현 샘플 : https://github.com/ryukbk/mobile_game_math_unity 프로젝트의 Chapter02 스크립트 참고.

(3인칭 카메라 이동)


-참고 : 유니티로 배우는 게임수학




'프로그래밍 > 수학' 카테고리의 다른 글

터치 영역판별 비트연산 코드  (0) 2019.01.22
Posted by JinFluenza
프로그래밍/유니티2017. 12. 14. 00:06

http://nielson.io/2016/04/2d-sprite-outlines-in-unity/

'프로그래밍 > 유니티' 카테고리의 다른 글

UnityEditor.AssetDatabase 함수로 경로내 파일 읽어오는법  (0) 2018.07.25
Unity Editor 확장 기능  (0) 2018.04.14
안드로이드 인증서 지문 구하는법  (0) 2017.12.08
LINQ  (0) 2017.03.21
IEnumerable , IEnumerator  (0) 2017.03.21
Posted by JinFluenza
프로그래밍/유니티2017. 12. 8. 18:49

http://akaisun.tistory.com/17

'프로그래밍 > 유니티' 카테고리의 다른 글

Unity Editor 확장 기능  (0) 2018.04.14
unity sprite outlineShader  (0) 2017.12.14
LINQ  (0) 2017.03.21
IEnumerable , IEnumerator  (0) 2017.03.21
드로우콜  (0) 2017.03.18
Posted by JinFluenza