파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀 점

 

알고리즘 문제풀이 

문제

입력된 배열의 요소 인덱스를 오름차순으로 정렬하는것은 어렵지 않지만 요소의 인덱스가 가리키는 문자가 중복인 경우가 고려야할 부분이다.  

 

//다른 사람풀이를 2문제를 분석함

다른 사람 풀이 _1

내가 풀려고 했던 접근은 입력된'n' 문자끼리 순서를 비교한 뒤 그 순서대로 정렬을 한다음에 중복된 'n'이 있으면 거기서 또 정렬을 하려고했는데, 이 코드를 보니까 그럴 필요가 없었다. 비교를 해야할 'n'을 맨 앞으로 빼고 그 다음에 정렬하면 된다.  

 

 

 

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀점

 

알고리즘문제풀이 

문제

입력된 long형식을 자릿수 별로 내림차순으로 정렬하는 것이 고려해야 할 부분이다.

 

내 풀이

list를 써서 (배열로 해도 될 듯) int형으로 자릿수 하나하나를 Add 하고, 다시 이중 포문으로 내림차순으로 정렬한다.

 

다른 사람 풀이

String.ToCharArray()로 long형식을 Char배열로 입력하고 입력된 문자를 Sort로 오름차순으로 정렬한 뒤 Reverse로 뒤집는다.  To.CharArray로 

ToInt64(String)

숫자의 지정된 문자열 표현을 해당하는 64비트 부호 있는 정수로 변환합니다.

String.ToCharArray Method

이 인스턴스의 문자를 유니코드 문자 배열에 복사합니다.

 

 

11047번: 동전 0

첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000) 둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)

www.acmicpc.net

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀 점

 

알고리즘문제풀이 

문제

최소의 동전 갯수로  입력된 값을 만드는 문제이다.  가장  큰가치의 돈부터 접근하여 필요한 동전갯수를 증가시키는 방법이 좋을 듯 하다.

 

내 풀이

for문 안에 while문이 없으면 한번만 계산하고 다음 인덱스로 넘어가기 때문에 

(ex 입력된 값 4200원 , coin[i] = 1000 인경우

4200 / 1000 을 4번 해줘야함)

 

 

 

 

 

 

11399번: ATM

첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000)

www.acmicpc.net

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀 점

 

알고리즘문제풀이 

문제

1. 기다리는 사람들의 총 최소시간을 구하기 위한 정렬

2. 각 사람당 몇분이 걸렸는지 계산

 

내 풀이

1. 오름차순으로 정렬하는 것이 가장 최소시간다.

2. 자신의 시간은 전 사람이 기달렸던 시간을 더해주면 기다리는 시간이 나온다.

내가 기다리는 시간 = 전 사람시간 + 내가 뽑는 시간 

 

 

 

 

11399번: ATM

첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000)

www.acmicpc.net

 

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀 점

 

알고리즘문제풀이 

문제

입력된 문자열의 알파벳이 +n 했을 경우 'z', 'Z'을 초과했을 경우 다시 'a', 'A'부터 밀려난 값을 구하는 것이 포인트

ex) 알파벳 'y'이고 n 값이 '25'이면 'z'를 초과 하게된다.

 

내 풀이

맨 처음 if(temp == 32)는 공백인 경우의 아무 작업도 하지 않기 위해 넣었음  다른 방법이 있을 것 같은데;;

'a~z', 'A~Z'은 알파벳은 26개이며 입력된 값이 90을 넘을 경우(90('Z') , 122('z')) 다시 알파벳이 시작되는('a', 'A')부터 시작하기 위해 -26을 빼는 과정으로 해결했다. 

 

다른 사람 풀이

'z'와'Z'를 각각 int로 캐스팅한 값을 가지고, if가 공백이 아닌 경우를 체크하고 밑에서 char.IsUpper로 대, 소문자를 체크해주는데 이 과정이  굳이 없어도 될 것 같다. 마지막에는 answer +=을 해주는 게 아닌 string.fomat을 활용해서 채워주고 있다.

위 코드를 활용해서 조건문을 좀 줄여서 다시 작성해봤다.

느낀 점

확실히 같은 문제를 봐도 접근하는 방법이 다르다는 것을 느꼈다. 물론 이 문제 자체가 복잡하지 않아서 크게 벗어나지는 않지만 IsUpper를 이용해서 보이는 코드 길이를 줄일 수 있었다.

 

 

 

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀점

 

알고리즘문제풀이 

문제

배열의 요소중 "Kim"가 몇번째 있는지 구하는 것이 포인트

 

내 풀이

주어진 string[]을 순회하면서 "Kim"을 찾도록했다.

 

다른 사람 풀이

Array.FindIndex()로 특정한 string값을 뽑는 함수를 이용했다.

 

 

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀 점

 

알고리즘문제풀이 

문제

입력된 divisor로 나누었을 때 나머지 값이 0인 element를 구하고 오름차순으로 정렬하는 것이 포인트

 

내 풀이

'%'를 이용해 0이 나오면 나누어 떨어지기 때문에 요소들을 간단히 구할 수 있었다.  

 

다른 사람 풀이

다른 점으로는 divisor이 1 경우  AddRange를 통해 입력받고 있다.

 

느낀 점

문제 자체가 워낙 간단한 문제이고, 리스트와 배열을 정렬하는 함수가 있기 때문에 쉽게 해결할 수 있었다. 

 

 

 

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀점

 

알고리즘문제풀이 

문제

입력된 두 정수중 큰 수와 작은 수를 구하는 과정이 포인트

 

내 풀이

삼항 연산자로 max(큰 수), min(작은 수)를 구하고 for문으로 min이 시작 값 max가 끝 값으로 순회하면서 answer에 더하도록 했다.

 

다른 사람 풀이

큰, 작은 값을 구하지 않고 while문으로 a! = b라는 조건으로 a값을 기준으로

a가 크면 -1, 작으면 +1로 해주고 있다. 이 과정이 a부터 b사이에 값을 더해주는 과정이고 마지막 결괏값을 리턴할 때 b를 더해줌으로써 a와 b까지의 값을 모두 더한 값이 된다. 

 

느낀 점

내가 문제를 보고 포인트라고 생각했던 것은 a가 b 중 누가 더 큰 값인지, 작은 값인지 체크하는 것이었는데, 시작 값이나 끝 값을 미리 정하는 것이 아닌 반복문을 통해 기준으로 잡은 값이 큰 값이면 빼고 작은 값이면 더하는 방식으로 입력받은 두수 사이를 모두 더 할 수 있었다. a!=b인 조건인 두 수가 같을 때 반복문을 빠져나가는 조건은 a값이 b값 바로 전 정수까지 다 다랐다는 말이다. 

 

 

 

 디자인 패턴 

싱글톤 패턴

같은 인스턴스를 여러 개 만들지 않고, 최초 한번만 메모리를 할당하고 그 메모리에 인스턴스를 만들어서 사용하는 패턴이다. 어디서든지 접근하기 쉽다.

 

구현방법

가장 기본적인 싱글턴 구현 방법이다. 인스턴스를 요청하기 전까지는 객체를 생성하지 않는다.

늦은 초기화(Lazy initialization) : 멀티스레드 환경에서는 동시에 Instance을 호출하게 되면 둘 이상 객체가 만들어질 위험이 있다.

 

정적 초기화

이른 초기화(Eager initialization) 

로딩 때 생성되므로 스레딩에 안전한 대신 미리 생성하므로 안 쓰는 경우에 메모리 낭비가 될 수 있음

 

멀티스레드에서 교착상태를 피하기 위한 싱글턴

교착상태를 피하기 위해 이중 검사 잠금

lock키워드 설명 : http://www.csharpstudy.com/Threads/lock.aspx

 

싱글턴 문제점

개방 폐쇄 원칙(OCP)을 위배될 수 있다. (객체 지향 설계 원칙)

커플링이 심해질 수 있음 => 한 곳에서 변경이 다른 부분에 영향을 미치게 될 확률이 커짐

 

학습 참고 사이트

 

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀점

문제


우선 문제를 봤을 때 고려할 부분으로는

입력된 string의 길이가 짝수인지 홀수인지 체크해주고 중간값을 반환하는 부분이다. 

 

 

내 풀이


2로 나눈 나머지값으로 짝/홀을 확인한다. 문제도 그렇고 어렵지 않은 내용인듯 하다.

 

다른 사람의 풀이


일단 짝/홀을 비교하는 조건문이 없다.   Substring(시작인덱스,시작인덱스로부터 몇번까지)으로  반환하고있다. 

 

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀점

문제


우선 문제를 봤을 때 고려할 부분으로는

첫 번째로, 여벌은 1개이기에 중복적으로 빌려줄 수 없도록 해야한다.

두 번쨰로는 잃어버린 학생과 여벌로 가져온 학생이 같을 수 있다. (당연히 여벌은 1개라 빌려줄 수 없다.)

 

 

내 풀이


잃어버린 학생배열과 여벌을 가져온 학생배열을 list로 옮긴 후 두 배열을 비교하여 중복된 값을 구한다.(두 번째 고려사항)

마지막 foreach문에서 빌려줄수있는 학생배열을 순회하면서 빌려준 학생은 다시 빌릴 수 없도록 삭제시켜주고 있다.(첫 번째 고려사항) 

 

 

다른 사람의 풀이


우선 차이점으로 중복된 값을 걸러내기위한 반복문을 사용하지않고 Linq기능을 사용하여 lost, reserve배열 서로 중복되지 않는 값만 입력받았도록 하고있다.

Linq기능을 사용하면 간결하고 연산 횟수가 줄지만, 가비지가 생성하기에 게임을 개발에 사용하기에는 적절하지 않다.   

 

제어구조


if

String.valid? string인지 체크

 


unless

is_intege 숫자인지 체크

 


case

여러 패턴에 대해 매치해야 한다면 case를 이용

일치하는 패턴이 없는 경우 에러발생

'_'는 "그 외의 모든 것"에 매치되는 else처럼 생각하면 된다. (case구문에서 '_'이 없다면 일치하는 패턴이 없을 때 오류 발생)

 

'_'사용

 

case는 패턴 매칭에 의존하기 때문에 같은 규칙과 제약이 모두 적용된다. 기존의 변수에 매치하고자 한다면 핀연산자를 사용해야한다.

 

when으로 점검기능이있다. x > 0 크면 "Will match"

 


Cond

값이 아닌 조건식에 매치해야 할 때 사용 (else if 기능)

Cond문 마찬가지로 예외처리가 없으면 에러를 발생하는데, true조건식으로 처리해준다.

 


with

중첩된 case구문이 쓰일만한 곳이나 깔끔하게 파이프 연산을 할 수 없는 상황에서 유용하다.

'<-'은 오른쪽을 왼쪽과 비교하기 위해 패턴매칭을 사용

매치 실패한 경우

 

'프로그래밍언어 > Elixir' 카테고리의 다른 글

Elixir) 예제 연습_패턴 매칭  (0) 2019.08.22
(Elixir)로 JSON API 서버 만들기  (0) 2019.08.21
Elixir) 예제 연습 Enum  (0) 2019.08.21

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀점

문제


우선 문제를 봤을 때 고려할 부분으로는 1,2,3학생 답 배열의 담겨있는 수들의 규칙이다.   

 

 

내 풀이


학생 답 각각 배열을 생성하고 문제에서 보여주는 값들 중 다시 반복이 되는 수 전까지 담아준다.  

int[] st1 = new int[5] { 1, 2, 3, 4, 5 }

int[] st2 = new int[8] { 2, 1, 2, 3, 2, 4, 2, 5 }

int[] st3 = new int[10] { 3, 3, 1, 1, 2, 2, 4, 4, 5, 5 }

그리고 정답배열을 순회하면서 학생 배열과 비교하고 학생배열의 값과 같다면 정답카운트인 score 배열의 값을 변경 시켜주도록 한다.  (코드는 5,8,10으로 나누었지만 확장성으로 st1.Length으로 나누어도 된다)

제한조건으로 최고점자가 동률이 나오면 오름차순으로 모두 출력해주어야 하기 때문에 for문을 통해 최대값을 구하고 그 값과 같은 배열만 list에 담도록 했다. 

 

다른 사람의 풀이


우선 차이점으로 학생배열을 2차원 배열로 만들고, 이중for문을 통해 if문 한개로 모든 학생배열을 순회하는 방식으로 정답카운트를 체크하고 있다. 그리고 배열.Max()함수를 통해 최대값을 찾고 그 리스트를 리턴하는 방식이다

내 코드처럼 각각 배열을 3개 생성하지 않고, 이차원배열로 생성했으며, if문으로 각자 배열을 매직넘버인 1,2,3를 넣어서 순회하는 것이 아닌 이중포문으로 한번에 비교를 한다는점에서 더 효율적인 풀이법인 것같다.


 

 

패턴 매칭은 Elixir의 강력한 기능. 간단한 값, 자료 구조, 심지어는 함수까지도 매치시킬 수 있음

 

 

상수 매칭

 

컬렉션 매칭

1. 리스트

2. 튜플

 

핀 연산자

매치 연산자의 좌변에 변수가 포함되어 있을 때에는 값의 대입이 일어납니다. 하지만 경우에 따라서는, 뱐수에 새로운값이 대입되는 것을 원치 않을 수 있다. 이러한 상황에서는 핀 연산자^를 사용해야한다.

함수의 절에 핀연산 적용

 

Game logic


Update

호출되는 시점 :  스크립트가 활성화 된 경우 매프레임마다 호출

 

Fire Animation Eevents

호출되는 시점 :  마지막 Update시간과 최신 Update업데이트 시간사이에 모든 클립에서 애니메이션이벤트를 호출

 

OnAnimatorMove 

호출되는 시점 :  Update 프레임마다 Animator컴포넌트에 대해 한 번 호출

 

OnAnimatorIK

호출되는 시점 :  Update 프레임마다 Animator컴포넌트에 대해 한 번 호출

 

LateUpdate

호출되는 시점 : Update가 끝난 후 프레임당 한 번 호출

특징

1. Update에서 수행된 모든 계산은 LateUpdate가 시작 할 때 완료 됨

2. 일반적으로 3인칭 카메라에 사용된다.

(캐릭터를 움직이고 Update방향을 카메라 움직임과 로테이션 계산을 수행하는 경우 LateUpdate에서 카메라로 그 위치와 방향에 맞게 움직이도록)

 


 

Scene rendering


OnWillRenderObject

호출되는 시점 : 카메라에 오브젝트가 표시되면 각 카메라에 한 번 호출

특징

1. 스크립트가 활성화 되어있어야 호출됨

2. 모든 컬링된 객체들을 렌더링하기 바로 직전의 과정인 컬링 처리중에 호출

 

OnPreCull

호출되는 시점 : 카메라에서 장면을 컬링하기 전에 호출(프로스터 컬링)

특징

1. 카메라에 붙어있는 스크립트에만 호출

2. 카메라의 속성을 바꾸고싶을때 사용하면 좋음

 

OnBecameVisible / OnBecameInvisible

호출되는 시점 : 카메라에 표시되거나/표시되지 않을 때 호출

 

OnPreRender

호출되는 시점 : 카메라가 씬 렌더링을 렌딩하기 전에 호출

특징

1. yield 사용 가능

2. 스크립트는 카메라에 붙어있어야함 

 

OnRenderObject(queueIndex:int)

호출되는 시점 : 오브젝트가 렌더링처리 된 후 호출

특징

1. queueIndex은 해당 오브젝트를 렌더링할 때 사용하는 렌더 큐의 값

 

OnPostRender

호출되는 시점 : 카메라가 씬 렌더링을 마친 후 호출

특징

1. 카메라에 붙어있는 스크립트에만 호출

2. 해당 카메라가 모든 오브젝트를 렌더링한 후 호출

 

OnRenderImage

호출되는 시점 : 씬 렌더링이 완료된 후 호출

 


 

Gizmo rendering


OnDrawGizmos

특징

1. 시각화 목적으로 씬 뷰에 기즈모를 그릴 때 사용


 

End of frame


yield WaitForEndOfFrame

호출되는 시점 : 하나의 프레임이 완전히 종료될 때 호출 

특징

1.  Update,LateUpdate이벤트가 모두 실행되고 화면에 렌더링이 끝난 이후 호출


 

Decommissioning


OnDisable

호출되는 시점 : 스크립트가 비 활성화 되거나 오브젝트가 비 활성 상태가 될 때 호출

특징

1. 오브젝트가 제거되는 경우에도 호출

2. 삭제를 위한 작업에 사용

3. 에디터모드일때 스크립트가 다시 로드되는 경우에도 호출

4. Start와 달리 코루틴 사용할 수 없음

OnDestroy

호출되는 시점 : 오브젝트 존재의 마지막 프레임 업데이트를 마친 후 에 호출

특징

1. 씬 게임이 종료될 때 도 발생

2. 오브젝트가 상태가 활성화 상태였던 경우에만 호출

 

프로젝트를 하면서  유니티 어떤 함수가 먼저 호출 될까? 라는 생각을 했지만  순서의 영향이 주는 프로젝트가 아니어서 넘어갔었는데 이참에 정리해보았다.

 

함수호출 순서로(위에서 부터 먼저 호출)

 

Initializion (초기화부분)

 


Awake

호출되는 시점 :  스크립트 객체가 로딩될 때, 단 한번 호출됨

특징

1.  모든 오브젝트가 초기화 된 후 호출된다.

2. Start함수 전에 호출된다.

3. coroutine동작 불가능

 

OnEnable

호출되는 시점 :  스크립트가 켜질 때

특징

1.  플레이모드 중에 스크립트를 편집할 경우, 편집이 끝난 후 스크립트가 다시 로딩되면 호출됨(Awake와 Start는 호출되지 않음)

2.   Awake함수 호출 후  호출됨 

 

Start

호출되는 시점 :  Update함수가 처음 호출 될 때 Update함수 직전에, 단 한번 호출됨

특징

1.  Awake와 다르게  start함수는 스크립트가 켜져있을 때 호출된다. (Awake는 스크립트가 꺼진 상태에도 호출됨)

2. Awake함수는 항상 Start함수 호출되기 전에 호출 된다.


 

 

Physics (물리)


FixedUpdate

호출되는 시점 :  스크립트가 켜져 있을 때 매프레임마다 호출

특징

1.  설정한 값에  따라 일정한 간격으로 호출된다.

2. 모든 물리계산 업데이트는 FixedUpdate후 즉시 발생된다.

3. 일정한 시간으로 호출되기에 Time.deltaTime을 곱할 필요 없다.

4.  Rigidbdoy를 다룰 때  일정한 힘을 가할 때, Update함수 대신에 사용 

(불규칙적인 Update에서는 물리엔진충돌 검사 등이 잘 안될 수 있다.)  

 

yield WaitForFixedUpdate (코루틴)

호출되는 시점 :  모든 FixedUpdate가 모든 스크립트에 호출된 후 

특징

1.  당연히 yield코루틴 명령문에서만 사용 가능

 

OnTriggerXXX, OnCollisionXXX

특징은 여기서 정리했다.

https://funfunhanblog.tistory.com/13

 

유니티) 충돌체크 OnTriggerEnter , OnCollisionEnter (Collider, Collision) #2Roll a Ball 로 연습하기

OnTrigger , OnCollision 비교하기 Collider 유니티에서 충돌체크를 하기 위한 필요한 컴포넌트이다. 3D오브젝트를 생성하면 Collider가 자동적으로 추가 되어있다. 먼저 Trigger에 대해 살펴보자 1) void OnTrigg..

funfunhanblog.tistory.com

 


 

 

Input events


OnMouseXXX

특징 : 마우스입력으로 호출되는 이벤트함수

 


Unity) 유니티 이벤트실행순서 / 플로우차트(Script Lifecycle Flowchart) #2

https://funfunhanblog.tistory.com/253

 

 

 

 

 

유니티 - 매뉴얼: 이벤트 함수의 실행 순서

자동 메모리 관리를 이해하기 이벤트 함수의 실행 순서 Unity 스크립팅시, 미리 정의된 순서대로 실행되는 많은 이벤트 함수가 있습니다. 아래에서는, 실행 순서를 설명합니다. 에디터 __ Reset : __ Reset은 개체가 처음 연결되었을 때 스크립트의 프로퍼티로 초기화하는 데 호출됩니다. Reset 명령을 실행했을 때도 마찬가지입니다. 첫 번째 씬 로드 이 함수는 씬이 시작되면 호출됩니다(씬의 각 오브젝트에 대해 한 번). __ Awake : __이

docs.unity3d.com

어떤 임의의 URL을 입력하면 JSON형식의 텍스트를 반환하는 API서버

 

프로젝트 생성

cmd터미널에서 mix new 명령으로 새프로젝트를 생성한다.

그러면 아래 처럼 내컴퓨터의 생성한 프로젝트 이름으로 폴더가 생긴다.

 

생성한 디렉터리로 들어가서 구조를 확인해봤다.

 

 

의존 라이브러리 추가하기

mix.exe파일에 끝에있는 deps함수를 수정한다. 프로젝트에서 의존하는 라이브러리를 추가하는 부분이다.

   나는 {:plug_cowboy , " ~> 1.0 " }, 이걸로 종속성을 수정해야 되었다.

 

밑에 mix명령어를 통해 로컬프로젝트 속으로 import시킨다.

 

 

다음은 application함수를 아래와 같이 수정하자

이 프로젝트에서사용될 어플리케이션들을 선언하는 부분이다.

 

아래와 같이 입력하면 iex 입력으로 바뀐다.

이 상태에서 앞서 mix설정에서 추가한 웹서버인 CowboyHTTP서버를 실행하자

아래 명령문을 통해 실행한다.

웹브라우저를 통한 확인

잘나오면 MyApp모듈이 Cowboy웹서버와 연동이 된것이다. 

 

 

API 서버 구현

URL/users/tom을 호출하면 사용자 프로필 정보를 JSON형식으로 출력하는 간단한 API서버가 된다.

my_app.ex파일 수정

get " /users/:name" do부분에서 URL맵핑을 통해 웹요청을 처리하고,

마지막 match _do부분은 이도저도 아닌 나머지 요청에 대한 처리(catch-all)루틴이다.

'|>'sms Elixir의 파이프 연산자이다.

 

명령행에서 API 서버 실행

IEx에 접속하여 Cowboy업데터를 호출하는 방법이 아닌 명령행에서 직접 API서버를 실행할 수 있도록 해보자

mix.exe파일을 열어 application함수를 아래와 같이 변경하자

mod키를 추가하여, 어플리케이션이 시작될 때 실행할 시작 모듈을 MyApp으로 지정하였다.

 

메인코드로 와서 start함수를 추가하자(어플리케이션이 시작될때 호출되는 함수다)

마지막으로 터미널에서 다음과 같이 mix run 명령어를 실행하면,

 

학습참고 

https://www.usefulparadigm.com/2017/02/03/building-a-json-api-server-using-elixir-and-plug/

 

all? 

아이템 요소가 모두 만족해야 한다.

 

any? 

하나라도 만족하면 true를 반환한다.

chunk_every

컬렉션을 입력한 숫자로 쪼개기

 

chunk_by

열거할수 있는 함수를 받아와서, 주어진 함수의 결과 값이 변할 때 마다 그룹을 새로 시작한다.

map_every

모든 n번째 아이템을 가져오며, 항상 첫번째 것에도 적용한다.

 

each

새로운 값을 만들어내지 않고 컬렉션에 대해 반복한다.

 

map

각 아이템마다 함수를 적용하여 새로운 컬렉션을 만들어내고자 할때

 

min

컬렉션 내의 최소값

max

컬렉션 내의 최대값

 

reduce

컬렉션을 하나의 값으로 추려낸다. 선택사향으로 축적자를 함수에 전달이 가능하다.

 

sort

컬렉션 정렬

1)함수 사용x

2)함수 사용

 

uniq_by

열거 가능한 집합 내의 중복요소를 제거

 

 

Elixir School

프로그래밍 언어 Elixir 배우기

elixirschool.com

 

운영체제 

교착상태

-  두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 떄문에 결과적으로 아무것도 못하는 상태

- 다중 프로그래밍 환경에서 흔히 발생할 수 있는 문제이다.

 

다중 프로그래밍 : CPU작업과 입출력 작업을 병행하는 것(메모리에 여러개의 프로그램을 상주시켜 하나의 CPU로 연산과 처리를 중첩시켜 CPU유휴시간을 감소하기 위한 기법

 

교착상태의조건

1. 자원점유와 대기

프로세스가 자신이 가질 수 있는 자원은 가지고 있으면서 다른 자원이 오기를 기다리는 것

 

2. 비선점

다른 프로세스에 할당된 자원은 사용이 끝날 때 까지 강제로 빼앗을 수 없다.

 

3. 순환대기

프로세스의 자원 할당에서 첫 번째 프로세스와 마지막 프로세스의 자원할당이 겹치게 되어 원형에 있는 모든 프로세스가 자원 할당을 받고자 기다리는 형태

 

4. 상호배제

한번에 한개의 프로세스만이 공유자원을 사용할 수 있어야 한다.

 

예방

1. 자원점유와 대기

프로세스가 실행되기 전 필요한 모든 자원을 할당하여 프로세스 대기를 없애거나 자원이 점유되지 않은 상태에서만 자원을 요구하도록 한다.

 

2. 비선점

자원을 점유하고 있는 프로세스가 다른 자원을 요구할 때 점유하고 있는 자원을 반납하고, 요구한 자원을 사용하기 위해 기다리게 한다.

 

3. 순환대기

자원을 선형 순서로 분류하여 고유 번호를 할당하고, 각 프로세스는 현재 점유한 자원의 고유 번호보다 앞이나 뒤 어느 한쪽 방향으로만 자원을 요구하도록 한다.

 

4. 상호배제

한번에 여러개의 프로세스가 공유자원을 사용할 수 있도록 한다.

 

회피

교착상태가 발생하면 적절히 피하는 방법

 

각 프로세스의 요청과 방출에 대한 순서를 파악하고 있다면 우리는 각 요청에 대해서 가능한 미래의 교착상태를 피하기위해 프로세스가 대기해야하는 지를 결정할 수 있다는 점에 착안하여 나온 방법

즉, 어떤 프로세스가 요청을 할 때 미래에 대한 분석을 통해 나의 요청을 늦추는 방법으로 교착상태를 피할 수 있다.

 

 

 

 

 

 

학습참고 :

1. https://coding-factory.tistory.com/311

2. https://frontalnh.github.io

'STUDY > 운영체제' 카테고리의 다른 글

[컴퓨터 구조] 캐시이론 Locality  (0) 2021.09.23

스킬사용이 가능해진 상태에서 스킬키를 입력받으면 초록색 원형 이미지를 보여준다.

그리고 레이캐스트로 y을 고정하고 x와z값으로 마우스 위치를 받아 움직여주도록 했다.

 

 

사용은 마우스 왼쪽클릭을 한번더 하면 발동하도록 처리했다.

 

 

함수호출순서로는

 

1.업데이트에서 입력키 받음

2.등록된 스킬인지 확인,해당 스킬 mp가 현재 mp보다 작은지

스킬 State =true,기본 공격State = false,

3.이펙트 풀에서 스킬오브젝트 가져옴

4.사정거리 표시(하얀 테두리),  초록색테두리 위치 업데이트(Ray캐스트) / 테이블에서 데이터 가져옴

 

마우스 클릭

발동

6. 테두리들 오브젝트 크기 원위치,및 오브젝트 비활성화

7. 초록색테두리(마우스 위치)로 이펙트 게임오브젝트 상태 true

8. 스킬오브젝트 주위기준으로 가까운 거리에 있는 몬스터들에게 데미지 처리 -> 플로팅텍스트 등등

9. 플레이어 mp감소,MP UI업데이트 

10. 스킬슬롯 UI쿨타임 시작,(해당 스킬 State =false 쿨타임이 끝날때 까지)

 

발동 후

11.기본공격 State = true, 스킬공격 State = false

12.이팩트 오브젝트 비활성화

13. 쿨타임 다되면 현재 mp값과 스킬가능상태 or 불가능상태 체크

14. 스킬슬롯 UI 업데이트 

 

 

 

 

 

펙스오브엑자일 처럼 무기의 잼을 장착할 수 있도록 하고싶었다. 잼을 장착한 무기는 특정할 스킬을 쓸 수 있도록

대장장이 NPC를 만들고 거기에 무기와 잼을 끌어다 놓으면 잼 장착이 가능하도록 했다.

 

잼 장착

잼이 장착되면 아이템슬롯에서 어떤잼이 장착되었는지 볼 수 있고

잼의 맞는 이팩트가 추가된다.

 

그리고 잼스킬이 활성화 된다.

 

잼 장착 해제

잼이 장착된 무기를 끌어다 놓으면 장착된 잼이 잼칸에 보여진다. 그리고 해제가 되면 인벤토리 비어있는 공간으로 다시 돌아간다.

 

 

아이템 고유ID 부여

인벤토리에 들어온 아이템은 고유ID를 갖기때문에 잼이 장착된 잼과 그렇지 않은 잼 구별이 가능하도록 했다.

 

 

 

 

 

캐릭터 선택

 

선택하는 직업의 캐릭터의 림 라이트를 적용해서 어떤 캐릭터가 선택되었는지 표현하도록 했다.

잘 안보이는 것 같기도..

 

몬스터 피격

몬스터 피격도 어떤 몬스터가 피격당했는지 표현되도록 했다.

 

여러 몬스터들을 피격한 경우

 

 

 

몬스터는 몸통전체가 같은 메테리얼로 적용되어있어서 몸통 Renderer로 한 부분만 알고 있으면 되지만 히어로 캐릭터 같은 경우는 머리, 몸통, 팔다리가 모두 분리되어있다. 아마도 부위마다 변경이 가능한 리소스라 나뉘어있는 듯하다.

 

모든 몬스터들은 같은 메테리얼을 쓰기때문에 메테리얼을 바꾸면 피격당하지 않은 몬스터들도 림 라이트 효과가 들어간다.

 

피격당한 몬스터의 메테리얼만 바꾸도록 MaterialPropertyBlock를 사용했다. 

 

(MaterialPropertyBlock의 대한 내용은 따로 정리 해야겠다.)

 

 

 

 

 

우선 PPT로 행동트리를 그려봤다. 

공격패턴은 근접2개 그리고 원거리 이펙트공격,점프공격이있다.

 

BT대로 구현한 내용을 Gif로 보면

 

근접공격 사거리(true)-> 근접공격

 

원거리 공격 사거리(true)-> RandomAction -> 점프공격 (확률45%)

 

원거리 공격 사거리(true)-> RandomAction -> 플레이어 추적 (확률45%)

원거리 공격 사거리(true)-> RandomAction -> 원거리 공격 (확률10%)

 

위험 체력 체크(true)-> 스켈레톤소환 -> 체력회복

 

 

몬스터로밍 범위를 테이블 값으로 불러왔었는데 이게 확장성도 낮고 낭떠러지, 등등 불규칙적인 맵에 적용하기가 힘들다.

그래서 인스펙터창에서 로밍 범위를 정하도록 바꾸었다.

 

 

 

기즈모를 이용하여 몬스터가 어디로 로밍범위를 보여주도록 했다.

 

 

call by value(값에 의한 호출)

값을 복사해서 전달하기 때문에 원본의 값(매개변수로 넘겨준 값)이 변경될 가능성이 없다. 하지만 참조에 의한 호출보다는 고비용이다. 

 

call by reference(참조에 의한 호출) 

원본의 값의 변경이 될수도 있다. 

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

C++) 생성자와 소멸자  (0) 2020.06.10
C++)접근 제한자  (0) 2020.06.09
C) 배열/문자열과 포인터.  (0) 2020.05.02
C) 파일 입출력 (FILE,fopen,fclose)  (0) 2020.05.02
C) ASCII 아스키코드  (0) 2020.05.01

 

스킬북UI

UI 구성은 왼쪽은 일반 스킬, 오른쪽은 잼스 킬로 무기의 잼을 장착할 수 가있는데 잼이 장착된 무기로 가능한 스킬이 생기게 된다.

 

잼 장착은 대장장이 NPC를 통해 만들 예정

 

스킬등록

선택팝업창UI는 재사용.

스킬을 등록하기 위해서는 두가지 조건이 있다. 스킬등록 포인트가 있어야하고 이전 스킬 등록 여부

 

 

 

스킬등록이되면 실제 입력키를 받는 딕셔너리에 추가하도록 했다.

스킬등록 취소

스킬등록을 해제하면 담겨있던 딕셔너리에서도 제거하도록 했다. 실제로 입력키를 받지 않도록 하기 위해서이다.

이게 좋을까 아니면 딕셔너리는 그대로 둔 채 그 입력키를 무효화시키는 코드를 추가하는 게 좋을지

 

 

스킬사용

밑에 있는 스킬슬롯에 표시되어 있는 숫자1~8, 그리고 F1~F4까지 입력키로 스킬을 사용한다.

 

스킬 사용가능 조건 :

1. WeaponState가 0(맨주먹)이면 스킬 사용 불가능

2. 재사용시간이 경과되지 않으면 사용 불가능

3. Mp가 부족하면 불가능

 

 

1
2

 

3
스킬마다 소모MP가 다르기 때문에 사용 가능한 스킬만 활성화 되어있다.

문제점 : 빨간색 / 해결방법 : 파란색 / 느낀 점 : 녹색 

 

비주얼 스튜디오 작업 중에 이런 오류가 났었다.

미리 컴파일된 헤더 파일이 이전 버전의 컴파일러에서 만들어졌거나 미리 컴파일된 헤더가 c++인데 c에서 사용하고 있거나 또는 그 반대의 경우입니다(Visual Studio 오류코드 C1853)

 

찾아보니 c파일과 cpp파일을 동시에 프로젝트에 삽입한 채로 빌드를 할 경우 이런 오류가 날 수도 있다고 한다.

 

 

 

오류 해결방법

 

'보기'탭 -> 솔루션 탐색기 (비주얼 스튜디오 처음 접하면 이거 찾는 경우가 많아서)

 

'미리 컴파일된 헤더 사용 안 함'으로 변경하기

 

안되면

컴파일 옵션 'C++ 코드로 컴파일'로 변경하기

 

일단 몬스터들은 마을맵에 몬스터 5종류?(고블린, 샤먼 고블린(원거리), 오크, 성난 돼지)

 

그리고 던전 씬의 2~3(보스 포함) 종류 정도 될 것 같다. 마을 씬에 입장하면 몬스터가 동적으로 생성된다. 그러 몬스터들은 각각 자기의 BT에 맞게 움직인다.

 

공격 판정

플레이어는 공격할 때 자기 공격 가능 범위(무기마다 다름)를 체크하고 그중에서 가장 가까운 몬스터들을 찾는다. (콜라이더를 사용하지 않음) 원래는 논타깃으로 플레이어가 정확히 몬스터가 있는 방향에서 공격을 해야 대미지 처리를 했지만 맞추기가 어려워 가장 가까운 몬스터가 있는 방향으로 회전하도록 했다.  

 

 

공격

공격은 기본 공격(히어로 공격력 + 무기 데미지)과 크리티컬 대미지 두 가지로 대미지를 입힐 수 있다. 크리티컬 확률은 플레이어 스텟인 크리티컬 확률로 나오도록 했다. 

 

 

UI처리

UI는 공격하고 있는 몬스터의 이름, 방어력, 체력을 뜨는  UI가 있고, 데미지 값을 보여주는 플로팅 텍스트가 있다.

플로팅 텍스트는 애니메이션 효과와 크리티컬 대미지인 경우 좌우로 흔들리는 효과는 트윈으로 처리했다.

플로팅텍스트 애니메이션

애니메이션 : 스케일 -> Y값 조절 -> 잠시 멈춤 -> 알파 값 조절

 

 

 

 

몬스터 종류는 아직 생각한 건 몇 가지 없지만 일단 가장 기본적인 근접 공격 몬스터를 만들 계획이었다.

 

몬스터들의 애니메이션은 믹스 아모(https://www.mixamo.com/#/)에서 구했다. 참 좋은 사이트이다.

 

보스 몬스터가 아닌 기본 몬스터는 플레이어보다 매우 단순하다. Idle, Walk, Run, Die, Attack 이 정도?

 

그러고 이제 이 몬스터들은 상황에 맞게 움직이기 위해 BT를 적용했다.

 

몬스터 종류의 따라 다르지만 처음 제작한 고블린은 BT는 이렇게 구성했다.

 

먼저 죽었는지 판단하고, 그렇지 않으면 다음 행동 조건을 체크하면서 해당하는 해동을 실행하도록 했다.

그 체크 조건들은 1) 공격 사거리인가? 2) 발견 거리인가? 3) 플레이어가 살아있나?

 

 

 

사실 조금 헤맸던 게 Sequence순서의 따라 동작이 의도했던 대로 안될 수가 있었기 때문에 시간이 걸렸던 것 같다. 

 

예를 들어 Sequence4와 Sequence순서가 바뀌었다고 가정하고 행동을 예상해보면 몬스터는 발견 거리가 되면 플레이어에게 달려간다. 그러고 원래라면 공격 거리가 되면 공격을 해야 하는데 계속 달려만 갈 것이다. 

 

공격 거리는 발견 거리보다 당연히 작을 수밖에 없기 때문에 Sequence6만 계속 실행될 것이다.

(물론 다른 BT함수를 만들거나 변형하면 될 수도 있지만 나는 생각이 안 났다.) 

 

 

로밍 (Squecne6)
추적 Squecne4,Squecne5
공격->추적->로밍

 

일단 퀘스트는 총 4가지 상태로 나뉜다. 

1) 받기 전

2) 받은 후

3) 완료

4) 현재 퀘스트와 관련 없는 상태

 

1) 받기 전 (퀘스트 수락)

캐릭터를 새로 생성하고 마을 씬에 들어오면 첫 번째로 퀘스트가 주어진다. 

오른쪽에 알림창같은 팝업으로 퀘스트 이름, 퀘스트 설명, 달성 현황이 표시되도록 했다.

NPC에게 받음

 

퀘스트 상태에 따라 대화 상자의 버튼과 NPC머리위 아이콘이 달라진다.

 

퀘스트를 받은후

 

퀘스트 받기 전  /  퀘스트 완료 후 

아이콘

받기 전&관련 없는 상태는 대화 상자 아이콘

받은 후는 물음표 아이콘,

퀘스트 완료상태인데 보상받기 전은 느낌표 아이콘을 보여주도록 한다.

 

받기전
받은 후

 

완료 후


2) 받은 후 (퀘스트 진행상태 로그 창)

퀘스트 로그 창을 단축기를 통해 열면 현재 받은 퀘스트 목록들을 볼 수 있다. 보상 아이템과 보상 골드, 보상 경험치 등을 확인할 수 있다.

4) 완료 (퀘스트 달성)

퀘스조건을 만족하면 퀘스트알림창과 퀘스트 로그창에 완료표시가 보여진다.

 

 

+ Recent posts