글

라벨이 Study인 게시물 표시

Hello Coding 그림으로 개념을 이해하는 알고리즘 Study Note 05

이미지
Chapter 5 해시 테이블 (Hash table) 해시 함수 - 자료구조 해시 테이블을 구현하기 위한 함수 - 문자열(string)을 받으서 숫자를 반환하는 함수 - 문자열에 대해 숫자를 할당(mapping) 해시 테이블 - 해시 함수 + 배열을 결합하여 만듬 - 충돌을 줄이는 해시 함수가있어야한다 - 해시 테이블은 키(key)와 값(value)를 가진다 - 해시 맵(hash maps), 맵(maps), 딕셔너리(dictionaries), 연관 배열(associative arrays) 라는 이름으로도 알려져 있음 - 속도가 빠르다, 평균적인 해시 테이블의 성능은 O(1) 상수시간이다 - 주요 프로그래밍 언어에서 구현되어 있음, 파이썬에는 딕셔너리라고 불리는 해시 테이블이 있다 - 사용률이 0.7보다 커지면 해시 테이블을 리사이징 하는 편 해시 테이블 사용 예 - 데이터 저장과 조회 ex) 전화번호부, 인터넷 주소와 ip주소 - 중복항목 방지 - 데이터 캐시로 사용 (자주 사용되는 정보를 다시 계산하지 않고 저장했다가 사용) Chapter 5 정리 해시 테이블은 빠르고 여러가지로 모형화 할 수 있기 때문에 아주 강력한 자료 구조 이다 해시 테이블의 평균적인 성능은 상수 시간이다 (정말 빠르다) 해시 테이블을 위해서는 잘 짜여진 해시 함수(좋은 분포를 가진)와 사용율에 따른 리사이징이 필요하다 다양한 프로그래밍 언어에서 구현되어 지원한다 다양한 용도로 사용되고 있다 SHA 라는 해시 함수를 공부 해보면 좋다

Hello Coding 그림으로 개념을 이해하는 알고리즘 Study Note 04

이미지
Chapter 4 퀵 정렬 (Quick Sort) 분할 정복 (Divide and conquer) - 분할 : 주어진 문제를 더 작은 크기의 동일한 문제로 분할 - 정복 : 분할된 각각의 작은 문제를 재귀적으로 해결 - 결합 : 분할된 문제의 해결책을 합쳐 원래 문제의 해결책을 얻음 장점 - 복잡한 문제를 간단한 문제로 나누어 해결 - 재귀적 구현을 통해 간결하게 구현할 수 있음 - 분할된 문제들을 병렬 처리할 수 있어 성능 향상에 도움 단점 - 재귀 호출에 따른 오버 헤드가 발생 할 수 있음 - 문제를 분할하는 과정에서 분할 비용이 발생할 수 있음 - 분할된 해결책을 합치는 과정에서 결합 비용이 발생할 수 있음 예시 - 퀵 정렬, 합병 정렬, 이진 탐색, 최대 공약수 구하기(유클리드 호체법) 유클리드 호제법 (Euclid's algorithm), 최대 공약수 (Greatest Common Divisor, GCD) - 두 개의 자연수의 최대공약수를 구하는 가장 효율적인 알고리즘 중 하나 - 큰 수를 작은 수로 나눈 나머지를 구함 - 나누는 수를 나머지로 바꾸고 나머지를 새로운 나누는 수로 하여 이전 과정 반복 - 나머지가 0이 되면 마지막으로 나눈 수가 최대공약수가 된다 퀵 정렬 (Quicksort) - 분할 정복 알고리즘의 대표적인 예시로, 평균적으로 매우 빠른 정렬 속도를 자랑하는 정렬 알고리즘 - 최악의 경우 시간 복잡도 O(n^2), 평균 O(n log n) 원리 - 피벗 선택 : 정렬할 배열에서 임의의 값 하나를 피벗(pivot)으로 선택 - 분할 : 피벗을 기준으로 배열을 두 부분으로 나눔(큰 값은 왼쪽, 작은 값은 오른쪽) - 재귀 호출 : 분할된 두 부분에 대해 각각 퀵 정렬을 재귀적으로 호출 - 결합 : 분할된 부분들이 정렬되면 전체 배열이 정렬된 상태가 됨 04_quicksort.py 작성 + 테스트 def quicksort ( array ):     # 기본단계 원소의 개수가 0이나 1이면 이미 정렬되어 있다   ...

Hello Coding 그림으로 개념을 이해하는 알고리즘 Study Note 03

이미지
  Chapter 3 재귀 (Recursion) 재귀 = 자기 자신을 참조(호출)하는 것 (함수에서 사용 => 재귀 함수) - 재귀 함수는 자기 자신을 호출하기 때문에 실수를 무한 반복하는 함수를 만들기 쉽다 - 기본 단계(base case) : 함수가 자기 자신을 다시 호출 하지 않는 경우, 무한 반복을 막는 부분 - 재귀 단계(recursion case) : 자기 자신을 호출하는 부분 - 재귀 함수는 기본단계와 재귀 단계 두 부분으로 나누어 작성 - 대표적 예로 팩토리얼이나 피보나치 수열 구현에 사용하는 예시가 있음 장점 - 복잡한 문제를 간결하게 표현 - 수학적인 문제 해결에 유용 단점 - 성능 저하 : 과도한 재귀 호출은 스택 오버플로우를 발생 시켜 프로그램이 비 정상적으로 종료 될 수 있음 - 로직이 잘못된 경우 무한루프에 빠질 수 있음 - 이해하기 어려울 수 있음 스택(Stack)과 호출 스택 (Call Stack) 스택 - 자료구조의 한 종류 - 후입선출 (LIFO Last In First Out), 가장 나중에 추가된 데이터가 가장 먼저 제거되는 구조 - 푸시(Push) : 삽입, 가장 위에 새로운 요소를 추가 - 팝(Pop) : 삭제, 가장 위에 있는 요소를 제거하고 반환 - 피크(Peek) 또는 톱(Top) : 맨위 데이터 조회, 가장 위에있는 요소를 제거하지 않고 반환 - 비어있는지 확인 (IsEmpty) : 스택이 비어있는지 확인 장점 - 간단한 구현, 후입선출(LIFO)의 특성, 재귀적 문제 해결 단점 - 랜덤 엑세스 불가능, 제한된 용도, 오버플로우나 오버헤드가 발생 할 수 있음 사용 예 - 브라우저의 뒤로 가기, Undo 기능, 재귀함수, 괄호 검사(괄호 짝) 호출 스택 - 프로그램에서 실행 중인 함수들의 정보(지역 변수, 매개 변수 등)를 저장하는 스택 - 여러 함수가 서로 호출하며 복잡한 작업을 수행하는데, 호출 스택으로 이를 관리, 제어 - 스택의 LIFO 형태로 인해 함수가 호출 될때 Push 하고, 실행이 완료 ...

Hello Coding 그림으로 개념을 이해하는 알고리즘 Study Note 02

이미지
  Chapter 2 선택 정렬 배열(array)과 연결 리스트(linked list) - 자료구조(Data structure)의 기본 - 메모리에 데이터가 어떻게 저장되는 지 미리 알아야 한다 - 데이터 저장을 위해서는 메모리의 주소를 할당 받고 나서 데이터가 저장됨 - 데이터 접근에는 임의 접근과 순차 접근이라는 두 가지 방식이 있다 (Random access, Sequential access) 배열 - 미리 원소의 갯수 만큼(초기화 단계에서) 메모리 주소를 할당 받고 원소를 각각의 주소에 저장하는 방식 - 인덱스(index)로 원소의 위치를 표시, 0부터 시작 - 읽기 O(1) 고정시간, 삽입 O(n) 선형시간, 삭제 O(n) 선형시간 - 임의 접근이 많은 경우 유리함 - 간단하고 빠른 데이터 접근이 가능하지만, 유연성이 부족하고 데이터 삽입/삭제에 비효율 적일 수 있음 - 배열의 모든 원소는 같은 자료형이여야 함 장점 - 미리 원소의 갯수를 알고 있을 때 유리 - 임의 접근에 유리하여(인덱스를 통한 빠른 접근) 특정 원소에 접근할 때 유리 (읽기) - 고정된 크기만큼 연속된 메모리 공간을 할당하여 사용되기 때문에 캐시 친화적이다 - 구현이 간단하며 대부분의 프로그래밍 언어에서 지원함 단점 - 원소를 추가하거나 삭제할 때 미리 할당 된 주소를 전부 옮겨야 하는 경우가 발생할 수 있음 - 따라서 처음 설정한 크기에서 원소를 추가/삭제하는 경우 불리함 (삽입, 삭제) - 실제 사용하는 데이터보다 더 큰 크기를 할당할 경우 메모리가 낭비 될 수 있음 활용 - 정렬된 데이터 저장 : 정렬된 데이터를 빠르게 검색해야 할 때 유리 - 행렬 연산 : 행렬을 표현하고 연산하는 데 사용 - 캐시 : CPU캐시는 배열과 유사한 구조로 작동하여 데이터에 빠르게 접근 - 단순한 데이터 목록 : 정적이거나 크기가 미리 예측 가능한 데이터 목록을 저장하는데 적합 연결 리스트 - 각 원소에서 그 다음 원소의 메모리 주소를 포인터로 연결되어 있는 방식 - 연속적인 메모리 공간...

Hello Coding 그림으로 개념을 이해하는 알고리즘 Study Note 01

이미지
Chapter 1 알고리즘의 소개 이진 탐색 - 정렬이 되어있는 원소 리스트가 필요 - 원소리스트의 중간 값으로 원소리스트의 절반씩 탐색 범위를 좁혀 가는 방법 - 이진 탐색은 크기가 n 인 리스트를 확인하기 위해 log n 번의 연산이 필요 - 빅오 표기법 O(log n) 코드 실행을 위해 Visual Studio Code + Anaconda 설치 01_binary_search.py 작성 테스트 def binary_search ( list , item ):     low = 0     high = len ( list ) - 1     loopCnt = 0     while low <= high :         loopCnt = loopCnt + 1         mid = ( low + high ) // 2         guess = list [ mid ]         if guess == item :             print ( f "LoopCnt : { loopCnt } " )             return mid         if guess > item :             high = mid - 1         else :             low = mid + 1     print ( f "LoopCnt : { loopCnt } " ) ...

Unity Google Play Games Services 연동 오류로 인한 삽질 기록

이미지
3줄 요약 1. Unity - Google Play Games Services 연동 오류 발생(Unity 2018.2.1f1, GPGS Plugin for Unity 0.9.50) 2. 구글링해보니 AndroidManifest.xml 파일 자동 생성시 공백이 잘못들어감 3. 생성할때 사용하는 템플릿 파일(template-AndroidManifest.txt)을 수정하고 다시 해보니 정상 동작! 삽질 & 구글링 나름 튜토리얼을 보면서 잘 따라 했것만... Google Play Console 의 출시관리>사전 출시 보고서에 비정상 종료 로그가 뜨고, APK 파일을 받아서 깔아보아도 제대로 실행이 안되었다. 오류 로그는 아래와 같음 사전출시 보고서 오류 리포트 문제: at com.google.android.gms.common.internal.zzh.handleMessage(Unknown Source:275) FATAL EXCEPTION: main Process: com.m2kestudio.unity.clicker, PID: 12207 java.lang.IllegalStateException: A fatal developer error has occurred. Check the logs for further information. at com.google.android.gms.common.internal.zze.zzv(Unknown Source:78) at com.google.android.gms.common.internal.zzi.zzakg(Unknown Source:54) at com.google.android.gms.common.internal.zzh.handleMessage(Unknown Source:275) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:19...

Unity 오브젝트들을 찾기 위한 방법 (Find Objects)

Unity 오브젝트들을 찾기 위한 방법 (Find Objects) 단 하나인 오브젝트에 접근하는 법은 여러가지가 있고 방법 자체도 쉬운편인거 같은데 오브젝트'들' 에 접근하는 방법은 제약이 좀 있는 느낌이였기 때문에 정리해 보았음 GameObject.FindGameObjectsWithTag     GameObject[] itemList = GameObject.FindGameObjectsWithTag("TileItem");          for (int i = 0; i < itemList.Length; i++) {     BaseItem item = itemList[i].GetComponent<BaseItem>();     //...     } 미리 지정한 Tag 를 사용해서 같은 Tag 를 가진 객체들을 가져옴 비활성화된 객체에 접근이 안된다고 한다 배열이 null 인 경우가 있을 수 있어서 예외처리 필요함 Resources.FindObjectsOfTypeAll 또는 Object.FindObjectsOfType     BaseItem[] itemList = Resources.FindObjectsOfTypeAll<BaseItem>();     for (int i = 0; i < itemList.Length; i++) {     BaseItem item = itemList[i];         //...     } 클래스 타잎으로 객체들을 가져옴. FindObjectsOfTypeAll 모든유형의 비활성화 된 객체도 가져옴 FindObjectsOfType 에셋 제외, 비활성화 객체 제외 하고 가져옴 둘다 성능 이슈가 있어서(매우 느리다고 ...

Unity Pixel Perfect 구현 정보 추가 및 정리

이미지
Unity 에서 Pixel Perfect 구현을 위한 방법 정리 1. 이전에 올렸던 글들 Unity3D 에서 당신의 Pixel Art 게임을 Pixel Perfect 하게 만들기 Pixel Art 게임에서 Unity 2D 스프라이트 설정 2. 오래된 글(2015/06/19) 이긴 하지만 Unity Blog에 올라왔던 글 Pixel Perfect 2D 3.  2D Pixel Perfect  GitHub 프로젝트 가장 최근에 찾은 정보, 추후 정식으로 유니티 자체에 제공할 듯 하다 해당 프로젝트를 다운받아 유니티로 불러와서 테스트 해볼 수 있음. 아직 정식으로 추가된것이 아닌 상황(2018/8/4) 이긴 하지만 돈주고 에셋스토어에서 Pixel Perfect Camera 를 사는 것보다 나을 것 같아서 적용해보았고 잘 동작함! 아래 도큐먼트가 잘 되어있으나 영어의 압박이... https://docs.unity3d.com/Packages/com.unity.2d.pixel-perfect@1.0/manual/index.html - 유니티 버전 2018.2.b3 버전 이상에서 부터 지원 - Window>Package Manager> All 탭에서 2D Pixel Perfect 인스톨 - Main Camera 오브젝트에 Pixel Perfect Camera 를 추가하고 PPU 값, 적용하려는 해상도 값을 적용하고 테스트 해보았을때 잘 동작하였음 4. Font 설정 Font 를 Pixel 스럽게(?) 표현하기 위해서 빈 오브젝트를 생성하고 아래 스크립트를 추가 public Font[] fonts; void Start () {   //폰트가 Pixel Perfect 하게 보이도록 설정   for(int i=0; i<fonts.Length;i++) {     fonts[i].material.mainTexture.filterMode ...

Pixel Art 게임에서 Unity 2D 스프라이트 설정

이미지
Unity Pixel Art 게임에서 2D 스프라이트 설정 어제 작성한 글 을 실제로 적용하다가 스프라이트 설정값을 제대로 셋팅 안하면 문제가 있다는 것을 알게 되어 삽질한 김에 다시 상세히 포스팅 함. 16x16px 이미지를 기본설정으로 불러왔을 때 Pixels Per Unit 스프라이트의 크기와 Pixels Per Unit 값을 맞춤 해당 이미지는 16x16px 이미지 Pixels Per Unit 맞추기 Filter Mode Filter Mode 를 Point(no filter) 로 변경 Filter Mode => Point(no filter) 변경 Compression Compression 값 None 변경 이게 바로 삽질하게 된... 계기 스프라이트 가운데 픽셀 색상이 다른색으로 보이는 현상... 이미지 압축 관련 설정을 빼먹어서 였다... Compression => None 스프라이트 관련 셋팅은 이것으로 끝인것 같음!

Unity3D 에서 당신의 Pixel Art 게임을 Pixel Perfect 하게 만들기

이미지
2D 게임 개발을 하던 중 도트 그래픽을 사용할 경우 Pixel Perfect 하게 하기 위한 작업이 필요하다는 것을 파악하고 잘 정리된 글을 찾아 번역기의 힘을 빌려 번역해봄…ㅎㅎ;; Making your Pixel Art Game look Pixel Perfect in Unity3D 원글 작성자 : ResistanceStdio 원글 작성일자 :  2018-03-26 Unity3D 에서 당신의 Pixel Art 게임을 Pixel Perfect 하게 만들기 얼마 전 게임을 Pixel Perfect 하게 만들기 위해 시간을 어느 정도 써야 한다고 언급했었죠. 아름다운 2D Pixel Art 게임을 어떤 해상도에서도 보기 좋게 하기 위해 이 작업을 해야만 합니다. 또한 우리는 오브젝트를 움직이거나 픽셀이 절반으로 내려앉는 것을 원치 않습니다. Unity는 기본적으로 Pixel Art를 완전하게 보여주지 않기 때문에 이곳 저곳을 바꾸거나 작은 수정사항을 구현하여 바꿀 필요가 있습니다. 하지만 걱정 마세요, 별로 어렵지 않습니다. Disclaimer (알려둘 사항) 모든 튜토리얼은 몇몇 소스를 기반으로 했지만 메인은 이 유용한 트위터 스레드 에 기반했습니다. 더 좋거나 최적화된 다른 방법이 있다는 것을 알고 있지만 이것이 내가 많은 연구 끝에 사용하는 방법입니다. 자 그럼 Pixel Perfect한 모습을 달성하기 위한 단계를 살펴 봅시다. 흐릿한(기본) 이미지에서 Pixel Perfect 로 Turn off Anti Aliasing (안티앨리어싱 끄기) 안티앨리어싱은 비디오게임들의 텍스처 테두리를 부드럽게 하기 위해 사용됩니다. 보통은 이것은 텍스처가 “너무 픽셀스럽게” 표시되지 않도록 하고 화면이 부드럽게 보이게 합니다. 여기 안티앨리어싱이 어떤 일을 하는지에 대한 예시가 하나 있습니다. 안티앨리어싱 예시 아래쪽 선이 부드럽고 흐릿합니다. 이것은 우리가 더 작은 해상도로 보게 되면 좀...

유니티 오피셜 튜토리얼 2D Roguelike 관련

이미지
https://unity3d.com/kr/learn/tutorials/s/2d-roguelike-tutorial 위 튜토리얼을 따라 하다 몇가지 오류 발생해서 해결방법을 찾았기에 포스팅 튜토리얼 제작 당시가 4.X 버전 대였던것 같고.. 현재는 2018.x 버전이 최신 버전이라 발생하는 문제로 생각된다. 튜토리얼 에셋에 동봉된 [2D Roguelike Upgrade Guide 5x.pdf] 파일에 있는 내용을 적용하더라도 게임 진행이 정상적으로 안되는 문제가 발생 1. 게임이 Day 2 부터 시작하고 다음 레벨은 Day4 2. Day 4 에서 갑자기 food가 0이되고 종료 3. 적을 뚫고 지나감 구글링한 결과 1, 2번 오류는 Scripts/GameManager.cs 파일 수정해서 해결됨 SceneManager 변경사항 때문에 발생하는 문제로 생각됨 private int level = 0;  // 1에서 0으로 수정 void Awake () {     ...     //InitGame(); 주석처리 } //아래 내용은 [2D Roguelike Upgrade Guide 5x.pdf]에 있음 void OnLevelFinishedLoading(Scene scene, LoadSceneMode mode) { level++; InitGame(); } void OnEnable() { SceneManager.sceneLoaded += OnLevelFinishedLoading; } void OnDisable() { SceneManager.sceneLoaded -= OnLevelFinishedLoading; } 3번 오류는 Enemy Prefab의 Box Collider 2D 사이즈가 0.0001 로 되어있어서 1로 수정해서 해결됨 참고한 글 https://forum.unity.com/threads/2d-roguelike-q...

유니티 오피셜 튜토리얼 Space Shooter 관련

이미지
튜토리얼 진행시 문제가 없으나 마지막 Space Shooter to Mobile 강좌를 보며 따라하는데 Mobile Art 의 다운로드 링크가 깨져서 해당파일이 올라가 있는 GitHub 프로젝트를 찾아 해당 리소스 추출함~ 다운로드 강좌 https://unity3d.com/kr/learn/tutorials/topics/mobile-touch/mobile-development-converting-space-shooter-mobile?playlist=17147 GitHub 프로젝트 https://github.com/jawadrashid2011/Space_Shooter/tree/Mobile

C 언어 공부 중(2)

이미지
1) printf 관련 정수 출력 d ecimal 10진수 o ctal 8진수 he x adecimal 16진수 %d 부호 있는 10진 정수 %o 부호 없는 8진 정수 %x 부호없는 16진 정수 8진수와 16진수로 음의 정수표현에 거의 안쓴다고함 8진수와 16진수 표현에 #을 넣으면 진수를 알수있도록 출력해줌 int num1=7, num2=13; printf("%o %#o \n", num1, num1); printf("%x %#x \n", num2, num2); 실수  출력 %f 10진 방식 부동소수점 실수 %e e 방식 부동소수점 실수 %g 소수점자리수가 길면 e방식 아니면 10진방식 부동소수점 실수 0.0000123 값을 e 방식 부동소수점 실수 표현 => 1.23e-5 문자열  출력 %s 문자열(char *) %c 값에 대응하는 문자 폭지정하는방법 왼쪽 정렬 = - (기본 오른쪽 정렬인듯 + 를 입력하면 +가 출력됨) 자리수 서식문자 => 최종적으로 %8d 오른쪽 정렬, 8자리, 정수출력 %-8d 왼쪽 정렬, 8자리 , 정수출력 같은식으로 출력하면됨 2) scanf 관련 정수 입력 d ecimal 10진수 o ctal 8진수 he x adecimal 16진수 %d 10진 정수 형태로 데이터를 입력 받는다 %o 8진 정수 형태로 데이터를 입력 받는다 %x 16진 정수 형태로 데이터를 입력 받는다 실수 입력 %f 10진 실수형 데이터를 입력 받는다 (float) %lf 10진 실수형 데이터를 입력 받는다 (double) %Lf 10진 실수형 데이터를 입력 받는다 (long double) (실수 입력시 e표현방식으로 입력해도 된다)

C 언어 공부 중(1)

이미지
기초부터 공부한다고... C공부 하다가 이것 저것 메모해 놓을 만한 것들이 생겨서 남김. 1) Visual Studio 2017 단축키를 이클립스와 비슷하게 변경 메뉴>옵션>환경>키보드 편집.선택영역을주석으로처리(Ctrl+K, Ctrl+C) => Ctrl + / 편집.선택영역의주석처리제거(Ctrl+K, Ctrl+U) => Ctrl + Shift + / 편집.줄삭제 => Ctrl + D 이클립스에서 쓰는 Crtl + Alt + Up, 이나 Crtl + Alt + Down 의 경우는 Ctrl + C 후 바로 Ctrl + V 를 누르면 비슷하게 사용 가능하고 수정하는 법을 못 찾았음. 2) 진수, 바이트 관련 영어 단어 binary 2진수 octal 8진수 decimal 10진수 hexadecimal 16진수 two's complement 2의 보수 floating point 부동 소수점 (여기서 '부'가 한자로 뜰 부 임 浮) fixed point 고정 소수점 3) 2진수 16진수 관련 2진수 한자리 = 1bit 2진수 4자리 = 4bit = 1nibble => 0~15까지 표현가능(16개의 값) 2진수 8자리 = 8bit = 1byte 16진수 한자리 = 0~15 까지 표현 가능 (16개의 값) 1nibble = 16진수 한자리로 치환해서 보기 편함! 16진수 한자리값을 2진수 4자리 표현 ex) 10진수 16을 16진수로 표현하면 10 ( C언어로 표기시 0x10 ) -> 1 을 2진수로 => 0001 -> 0 을 2진수로 => 0000     10진수 16을 2진수로 => 0001 0000 3) 빅엔디안(Big Endian), 리틀엔디안(Little Endian) 메모리에 어떤방식으로 저장하는가에 대한 내용, 네트워크 전송시(주로...