본문 바로가기
728x90

전체 글246

[Level1] 문자열 내 p와 y의 개수 [연습문제] C/C++ 문자열 내 p와 y의 개수대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다.예를들어 s가 pPoooyY면 true를 return하고 Pyy라면 false를 return합니다.제한사항문자열 s의 길이 : 50 이하의 자연수문자열 s는 알파벳으로만 이루어져 있습니다.입출력 예sanswerpPoooyYtruePyyfalse입출력 예 설명입출력 예 #1 'p'의 개수 2개, 'y'의 개수 2개로 같으므로 true를 return 합니다.입출력 예 #2 'p.. 2018. 9. 20.
[STM32F429]DCMI(Digital camera interface)와 OV7670 CAMERA-(1) (CAMERA 초기화 코드 및 캡쳐 및 영상 구현 코드는 9월20일 게시 예정) 2018. 9. 19.
[STM32F429]FSMC(Flexible Static Memory Controller)와 TFT_LCD(4) 소프트웨어 구성 S/W source(LCD.C) 아래부터 LCD.C 2018. 9. 6.
[STM32F429]FSMC(Flexible Static Memory Controller)와 TFT_LCD(3) 하드웨어 구성 2018. 9. 6.
[STM32F429]FSMC(Flexible Static Memory Controller)와 TFT_LCD(2) 2018. 9. 6.
[STM32F429]FSMC(Flexible Static Memory Controller)와 TFT_LCD(1) 2018. 9. 6.
한국교통대학교 취업창업지원과 한국교통대학교 취업창업지원과의 학생 지원 사업. 취업 프로그램 및 경력 개발 동아리 진로에 깊은 고민을 안고 취업선에 열정적인 학생들, 그리고 깊은 고민을 가까운 선배님 처럼 들어주고 학생들에게 진정 도움이되는 조언과 방향을 제시해주는 취업창업지원과 이명인 선생님. 많은 재학생들이 프로그램에 관심을 갖고 빠른취업이아닌 바른취업을 했으면 좋겠습니다. 컴퓨터공학과"임베디드 취업가즈아 팀" 대표 상담 인증샷. 2018. 5. 3.
Jump Throw의 좌표를 응용하여 y축으로만 값을 주어 점프를 하게 만듦 (점프 전의 모습과 좌표) (스페이스바를 누른 후 점프한 모습 그리고 좌표) 2016. 12. 28.
Throw 게임 오브젝트에 힘을 줘서 움직임을 만드는 방법. 게임 오브젝트에 힘을 주어 움직임을 만들려면 해당 게임 오브젝트에 물리 작용을 처리할 리지드바디(Rigdbody) 컴포넌트가 필요. [참고]6번재 줄의 힘을 달리하면 가해지는 힘의 양을 조절 하여 날아가는 거리를 조절 할 수 있다. 9번째줄의 백터값 또한 16번째줄의 힘과 백터값을 곱하기때문 날아가는 거리를 조절 할 수 있다. Vector3(각 x, y, z 축 방향) 위 코드는 800을 각 x , y 축으로 기존의 힘의 반으로 400의 힘으로 x, y 축으로 해당 오브젝트에 힘을가함.[참고] GetComponent로 Rigidbody를 불러와 AddForce 함수를 참조하여 AddForce의 매개변수에 연산된 백터 값을 넣어주면 해당 스크립트를 컴포넌트.. 2016. 12. 28.
identity(회전 일치) 게임에서 회전을 많이 한 다음에 초기화를 통해 월드의 방향과 회전을 일치시킨다거나 A의 회전과 B의 회전을 일치시키기 위한 방법이 필요하다. 이럴 때 사용하는 것이 Quaternion.identity를 이용한 정렬. (상자 회전 전)(키보드 (우) 키를 누르면서 박스를 회전)(박스가 회전한 이후 마우스로 화면을 클릭하면 다시 원위치로) 2016. 12. 27.
Rotate 게임의 기본동작 회전 7번째 줄 : 트랜스폼(transform)중 초기 회전(rotation) 값을 지정한다. 오일러각(Euler Angle)을 이용해 지정. 11번째 줄 : 트랜스폼(transform)중 초기 회전(rotation)값을 지정한다. 9번째 줄에서 쿼터니안값(Quaternion)을 만들고 이를 이용해 지정. 13번째 줄 : 트랜스폼(transform)중 회전 값을 현재 값에서 지정한 값만큼 회전(Rotate) 시킨다. * 7번째 줄의 코드가 실행됐을때 Y축으로 50도 회전한 값이 초깃값으로 지정된다. 11번째 줄의 코드가 실행됐을때 Y축으로 100도 회전한 값이 초기 값으로 다시 지정된다. 13번째 줄의 코드가 실행됐을때 Y축으로 90도 회전하는 동작이 일어난다. 결과적으로 Y축 각은 50.. 2016. 12. 27.
2016 유니티 로드쇼 서울지역 10월 29일 마지막 유니티 로드쇼가 개최 되었다. 기존에 대전 지역을 신청했지만, 학교 중요한 알고리즘 시험이 겹쳐있어 아쉽게 참석하지 못했었고, 그리하여, 유니티 관계자분께 따로 전화를 드려 알아보니 오프라인 접수도 받는다고 했다. 그동안 학교에 아직까지 게임개발 쪽에 흥미가있고 공부하는 학우는 찾지 못하여, 혼자 공부하는데 어려움이 많았다. 정확히 말하면, 기간도 짧지만 엔진에 대한 정보나 모르고 있는 사실들이 너무 많아, 책으로 공부하기에는 제공되는 다양한 서비스를 아는데에는 한계가 있었다 로드쇼에서 제공하는 정보들 중에는 유익한 것들이 많이 있었다. □ 유니티 VR관련 내용 을 요약하자면처음에 인상 깊었던점은 가상현실 기술을 활용한 Unity Editor 였다. 위 동영상은 현재 구현된.. 2016. 11. 21.
Player basic move □ Vector3 ◆ 방향을 지시하는 용도로 사용할 때는(x,y,z)값을 0과 1로 표시한다. 각 방향에 대한 상수값을 사용할 수도 있다.◆ 거리를 지시하는 용도로 사용할 때는 (x,y,z) 값을 해당 크기 만큼 표시한다. .벡터3(Vector3)는 오브젝트의 이동 방향을 지시하거나 이동 거리, 회전을 표시할 때 사용한다. □ 프레임 시간의 보정 Update 메서드는 iOS나 안드로이드 모바일 기기에서는 1초당 최대 60프레임이 호출된다. 그런데 Update 메서드가 호출되는 횟수가 모든 기기에서 정확하게 똑같지는 않다. Update 메서드에서 처리하는 내용이 많은 경우 최신 기기는 빠르게 처리해 초당 60번 호출하는 데 문제가 없을 수 있지만, 오래된 기기는 성능이 떨어져 초당 20프레임만 호출할 수도.. 2016. 11. 21.
K-means, Approx_k Clustering(의사코드, 근사비율) □ K-means 알고리즘 - k평균 클러스터링 알고리즘은 클러스터링 방법 중 분할법에 속한다. ex) N개의 데이터 오브젝트를 입력 받았다면, 분할법은 N보다 작거나 같은 K개의 그룹으로 나누는데, 이 때 각 군집은 클러스터를 형성하게 된다. (1개 이상의 데이터 오브젝트로 구성된 k개의 그룹으로 나누는것) 이 때 군집을 나누는 과정에서 같은 그룹 내 데이터 오브젝트 끼리 유사도는 증가 다른 그룹에 있는 데이터 오브젝트와의 유사도는 감소. - 최초에는 무작위 k개의 중심 1)데이터를 선정하고, 해당 데이터로부터 각 2)데이터의 거리(유클리디언, 맨하탄 등)을 계산한다. 그 거리의 평균이 작은 곳으로 3)중심점을 변경하고, 4)다시 거리를 계산하는 것을 반복하여 최적의 군집을 찾을 수 있다. (유클리디언.. 2016. 11. 16.
함수 포인터(Function Pointer) 와 보이드 포인터(Void*) □ 함수 포인터 - 실행 코드인 함수의 주소를 다루는 포인터 - 함수의 이름은 함수가 있는 메모리의 시작주소가 된다. 함수명이 함수의 메모리의 주소이므로, 함수 포인터에 저장하면 함수를 다양한 방식으로 호출 할 수 있다. 함수 형태는 매개변수의 개수와 자료형, 그리고 반환값의 자료형으로 정의 한다. □ 함수 포인터 배열 - 함수 포인터를 배열에 저장하여 사용할 수 있다. □ 예제로 함수 포인터 살펴보기 함수 포인터를 선언할때 매개변수의 타입 또는 갯수를 설정해주지 않은 경우에는 가리키는 함수의 매개변수 형태와 상관없이 (반환값은 일치해야함) 정상적으로 실행되는 모습을 볼 수 있다. 하지만, 함수 포인터의 매개변수 형태(갯수)를 지정해놓은 경우, 갯수가 맞지 않아 컴파일시 다음과 같은 오류를 보게된다. 에.. 2016. 11. 2.
데몬(daemon) 정리. 중지시켜도 되는 서비스 acpid : ACPI(Advanced Configuration and Power interface)방식의 시스템 전력 관리를 위한 데몬 anacron : 시스템이 꺼져있을 경우 수행되지 못한 작업 확인 및 수행 atd : at 작업 스케쥴러 auditd : 리눅스 감시 데몬 /etc/audit autofs: 자동마운트 데몬의 작동을 제어하는 프로그램 avahi-daemon : 네트워크 서비스를 인식하는 멀티캐스트 DNS서비스 Avahi 데몬 avahi-dnsconfd : DNS 재설정 기능을 위한 데몬 bluetooth : 블루투스 장치를 사용하기 위한 데몬 capi : Comman ISDN API conman : 콘솔 관리 지원 서비스. 다수의 콘솔 장치와 동시 접속자에 대한 .. 2016. 10. 1.
크러스컬 알고리즘(KruskalMST) □ 크러스컬 알고리즘은 최소비용 생성나무(spanning tree 스패닝 트리)를 찾는 알고리즘이다. (생성나무란 그래프 이론에서 모든 꼭짓점을 포함하는 부분 나무이다.) 크러스컬의 알고리즘은 최소 비용 신장 트리가 최소 비용의 간선으로 구성됨과 동시에 사이클(cycle)을 포함하지 않는다는 조건에 근거하여, 각 단계에서 사이클을 이루지 않는 최소 비용 간선을 선택. □ 크러스컬 알고리즘의 순서 - 먼저, 그래프의 각 간선(edge)들을 가중치의 오름차순으로 정렬. - 정렬된 간선들의 리스트에서 싸이클을 형성하지 않는 간선을 찾아 최소비용신장 트리(MST)의 집합에 추가 - 만약 사이클을 형성하면 그 간선은 버린다. □ 시간 복잡도KruskalMST(G)입력 : 가중치 그래프 G=(V,E), |V|=n,.. 2016. 9. 29.
Ctags를 이용한 소스분석 □ ctags - ctags를 이용하여 작업 디렉토리 혹은 그 하위 디렉토리 내의 소스파일에 정의되어있는 함수들로 진입하거나 다시 목록으로 돌아와 소스분석을 빠르게 할 수 있는 기능을 제공한다. 즉, 프로그램 소스내 변수 및 함수의 위치를 인덱스하여 바로바로 찾아볼 수 있게 만들어주는 것이다. □ ctags 설치/ vi와 함께 사용법 - 우분투 기준 설치 sudo apt-get install ctags 명령어를 통해 설치 할 수 있다. - ctags * : 현재 디렉토리내 모든 소스파일에 대해 tags 정보를 만들어 tags 파일을 생성한다. - ctags -R 현재 디렉토리와 하위디렉토리를 포함한 모든 소스파일에 대해 tags 정보를 만들어 tags 파일을 생성. - vi로 생성된 tags 파일을 살펴.. 2016. 9. 25.
포인터와 배열(Pointer & Array) -(2/2) □ 2차원 배열 ○ 2차원 배열은 1차원 배열처럼 배열명과 첨자를 사용하여 선언한다. - 각 배열요소의 형태는 int형 변수 4개짜리 1차원 배열이다. - 전체 배열은 12개의 int형 기억공간이 1차원 배열의 형태로 할당된다. ○ 2차원 배열에서의 1차원배열은 2차원배열의 일부. □ 2차원 배열의 초기화 ○ 1차원 배열처럼 초기화하며 초기화 값은 행 단위로 차례로 저장됨. ex) int array[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; 로 선언과 함께 초기화 된다면 int array[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; ○ 만약 해당 배열 요소를 초기화하지 않으면 0으로 채워진다; ex) int array[3][4]={{1},{5,6},{9.. 2016. 9. 24.
구조체(struct) □ 왜 구조체를 사용하는가? - 구조체를 사용하는 이유에 대해서는 특정한 객체(object)에 연관된 추상화된 정보들을 하나로 묶어 구조체 타입으로 정의하여 다루기 쉽게하기 위하여 사용한다. □ 구조체를 정의하는 방법 - struct 구조체이름{데이터타입 변수명;데이터타입 변수명;데이터타입 변수명; ..................}; □ 구조체 . 멤버 접근 연산자 & 함수 인자로서의 구조체 - 18~26행에서 처럼 멤버 접근 연산자(.)를 통하여 구조체 멤버에 접근할 수 있다. - 34번행에서 처럼 함수 파라미터로 구조체 변수를 넘겨줄수도 있다. □ 포인터 구조체 - 포인터의 표현방법은 ->와 .이 있다. -> : 화살표 앞의 변수가 포인터 변수이면 화살표를 사용한다. . : 점 앞의 변수가 포인터가.. 2016. 9. 23.
Clean Code: A Handbook of Agile Software Craftsmanship -저(Robert C. Martin) -Chapter(1) Chapter1 : Clean Code 처음 챕터에서는 가볍게 좋고 나쁜 코드가 무엇인지에대해 설명하고, 안좋은 코드가 만들어지는 원인과, 그걸 개선할 수 있는 몇가지 방법의 예시를 전문가들을 인용하여 설명하고있다, 안좋은 코드가 시간이 지날수록 생산성이 떨어진다는 자료와, 저명한 전문가들의 일부 방법들을 소개하며, 좋은 코드라는게 정확히 왜 좋은지 코드내에 문법적 오류는 없으나 왜 이런걸 쓰고 제거해야하는지 간략히 소개한다. 2016. 9. 12.
Strace : debugging tool 시스템 콜/시그널 추적 □ strace - strace는 시스템 콜과 시그널을 추적할 수 있는 일종의 디버깅 툴이다. 만약 프로그램이 지속적인 충돌을 일으키거나, 예상치 못한 동작을 하게되는 경우에도 유용하게 쓰일 수 있다 예를 들면 존재하지 않는 파일을 접근하여 열거나 읽으려할때 strace를 사용하여 문제가 되는 지점을 찾을 수 있다. GNU Debugger(gdb) 와 같은 코드 디버깅같은 세부사항들에 대해서 찾기에는 부적합 할 수 있으나 시스템 콜을 추적하는 툴에있어선 strace가 적합하다. 그리고 코드 디버깅 툴 보다 사용하기가 쉽다. 여기에 몇가지 예를 적고 자세한 사항은 man 페이지를 활용하면 될 것 같다. 각 라인을 잘보면 메모리에 맵핑 시키는것부터 파일을 열고 읽고 쓰고 닫고 하는데 있어 특정 구조체를 호출.. 2016. 9. 11.
메모리(Memory)관리-(2) □ Zone - 노드에 존재하는 물리메모리 중 16MB이하 부분을 관리하기 위해 node의 일부분을 따로 관리할 수 있도록한 자료구조 □ Page frame - 각각의 Zone은 자신에 속해 있는 물리 메모리들을 관리하는데, 이 물리 메모리의 최소단위 - 모든 페이지 프레임 당 하나씩 page 구조체가 존재. 이는 시스템이 부팅되는 순간에 구축되어 역시 물리 메모리 특정 위치에 저장 되는데 이 위치는 mem_map이라는 전역 배열을 통해 접근. 그림처럼 복수 개의 페이지 프레임이 zone을 구성하며 떄에 따라 하나 혹은 그 이상의 zone이 node를 구성하며, 역시 시스템 구조에 따라 하나 혹은 그 이상의 node가 존재하는 것이 리눅스의 전체 물리 메모리 관리 구조. 2016. 9. 9.
포인터와 배열(Pointer & Array) -(1/2) □ 배열의 이름은 배열의 시작 주소이다. - 배열의 주소접근 예제) 위 그림에서 int형 변수 3개인 배열을 생성하였다. 첫번째 결과값의 배열의 첫번째 인덱스 array[0]의 주소(&)와 같은 주소를 갖는것을 확인 할 수 있다. sizeof 함수를 사용하여 바이트 크기를 측정하면, 64bit인 경우 주소의 크기는 8바이트를 갖는것을 볼 수 있으나 (32bit인 경우 4바이트) sizeof(array) 2016. 9. 9.
포인터(Pointer) □ 포인터는 변수의 메모리 주소를 저장하는 변수다 변수는 메모리 상의 저장 공간이므로 그 위치(주소)를 알면 사용할 수 있다. □ 주소 연산자(&)프로그램이 사용하는 메모리에는 바이트별로 주소값이 있다. 이 값은 0부터 시작하고 바이트 단위로 1씩 증가하므로 2바이트 이상의 크기를 갖는 변수는 여러 개의 주소값에 걸쳐 할당된다. 예를 들어 변수 a가 메모리 100번지부터 할당되었다면 100번지부터 103번지까지 4바이트에 걸쳐 할당된다. 주소는 변수가 할돵된 메모리 공간의 시작 주소를 사용 주소 연산자(&)의 사용법 예제 포인터는 주소를 저장하는 변수로 일반 변수와 마찬가지로 선언한 후에 사용한다. 선언하는 방법은 변수 앞에 *만 붙여주면 된다. 간접참조 연산자(*) 예제) *pa == num ① num.. 2016. 9. 8.
메모리(Memory)관리-(1) □ SMP(Symmetric Multiprocessing) - 복수 개의 CPU를 가지고 있는 컴퓨터 시스템 중 모든 CPU가 메모리와 입출력 버스 등을 공유하는 구조 □ NUMA(Non-Uniform Memory Access) - CPU들을 몇 개의 그룹으로 나누고 각각의 그룹에게 별도의 지역 메모리를 주는 구조 □ Bank - 리눅스에서 접근 속도가 같은 메모리의 집합 - UMA구조(NUMA의 반대)는 한 개의 뱅크가 존재 - NUMA구조라면 복수개의 뱅크가 존재 □ Node - 뱅크를 표현하는 구조 (~/include/linux/mmozone.h) - 만약 UMA 구조(Uniform Memory Access)의 시스템에서 리눅스가 수행된다면 한 개의 노드가 존재할 것이며, 이 노드는 리눅스의 전역 .. 2016. 9. 6.
getenv 함수 -linux system programming 쉘 프로그래밍 □ 형태 - 헤더 : #include char *getenv(const char * name); 반환(char *) 환경 변수의 값. 인수 : char * name 구하려는 환경 변수의 이름 getenv() 함수는 name 이름을 가지는 환경변수에 저장된 값을 읽어온다. 환경 변수는 "key=value" 형태로 저장되며, getenv()의 아규먼트로 들어가는 name은 Key 이름이 된다. 만약 일치하는 name을 가지는 환경변수가 있다면 "값"을 되돌려주고 없다면 NULL을 반환. 2016. 9. 4.
쉘(Shell) 프로그램 이 쉘의 main 함수에서는 사용자로부터 입력 받아서 run() 함수를 수행한다. 이때 사용자로부터 입력된 내용을 함수의 인자로 넘겨주는데, run() 함수는 이 입력 내용을 분석한다. 간단히 공백을 토큰으로 분리하는데, tokenize() 함수가 이 역할을 수행한다. 여러 개의 토큰으로 분리가 되면 첫 번째 토큰 값을 기준으로 내장 명령어인지 확인. 만약 쉘의 내장 명령어라면 해당 명령어를 수행, else 해당 프로그램의 수행을 시도. run함수에서 fork 함수를 통해 자식 프로세스가 생성되면 자식 프로세스는 exec 함수로 사용자가 입력한 프로그램을 수행시킨다. 프로세스의 인자를 배열로 넘겨 환경변수의 값으로 변환하여 프로세스의 실행이 가능하도록 execvp()함수를 이용함. 2016. 9. 4.
태스크(task)관리-(5) □ 문맥 교환(context switch) - 수행 중이던 태스크의 동작을 멈추고 다른 태스크로 전환하는 과정을 문맥 교환이라 부른다. 리눅스 커널은 태스크가 문맥교환 되는 시점에 어디까지 수행했는지, 현재 CPU의 레지스터 값은 얼마인지 등을 저장해 둔다. 이를 문맥 저장(context save)이라 한다. 즉, 스케줄링이 일어나면 문맥 교환이 발생하고, 문맥 교환 시엔 현재 수행 중이던 태스크의 문맥을 저장해 두어야 한다. □ 문맥 저장(context save) - 태스크가 문맥 교환 시점에 어디까지 수행되었는지를 현재 CPU의 레지스터값이 얼마인지를 저장한다. - task_struct의 thread 필드(struct thread_struct 타입)에 저장 - 태스크가 실행하다가 중단되어야 할 때 태.. 2016. 9. 2.
태스크(task)관리-(4) □ 런 큐와 스케줄링 - 여러 개의 태스크들 중에서 다음번 수행시킬 태스크를 선택하여 CPU라는 자원을 할당하는 과정을 스케줄링이라 한다. 리눅스의 태스크는 실시간 태스크0~99단계(숫자가 높을수록 우선순위가 높음), 일반 태스크100~139까지 사용하며, 실시간 태스크는 항상 일반 태스크 보다 우선하여 실행된다. ○ 런 큐와 태스크 - 리눅스에선 스케줄링 작업을위해 런 큐(Runqueue) 자료구조를 통해 관리한다. 스케줄러가 수행되면 해당 CPU의 런 큐에서 다음번 수행시킬 태스크를 골라낸다. 어떤 태스크를 선택할지는 일반 태스크를 위해 CFS(Completely Fair Scheduler)를 사용하며, 실시간 태스크를 위해서는 FIFO, RR, DEADLINE 정책을 제공한다. ○ 실시간 태스크 스.. 2016. 9. 2.
728x90