[디자인패턴 with Unity] 전략 패턴
·
CS/디자인패턴 with Unity
전략 패턴의 미적용 사례 게임 내에서 플레이가 멈춰 있는 경우는 거의 없다. 따라서 런타임에 게임 오브젝트는 변하는 상황에 따라 업데이트되어야 한다. 전투 시스템에서 플레이어블 캐릭터가 근접 공격, 원거리 공격 등 다양한 공격 모드로 전환하는 경우를 예시로 들 수 있다. 이때, switch 문장을 이용해서 플레이어의 공격 모드를 관리한다면 어떻게 될까? 공격 모드의 경우가 적다면 별 상관이 없을 것이라 생각할 수 있지만, 공격 모드가 점점 추가된다면 switch 구문에 추가되는 공격 모드에 대응하는 코드를 매번 작성해야만 한다. 이것은 굉장히 비효율적이고 개방-폐쇄 원칙에 위배된다. 123456789101112131415161718void Ability(Ability ability){ switch ..
[객체지향설계 & 패턴] Iterator 패턴
·
CS/객체지향설계 & 패턴
Iterator 패턴Java에서 배열의 요소를 print하는 경우를 생각해보자.123for (int i=0; iarr.length; i++) { System.out.println(arr[i]);}Colored by Color Scriptercs위 코드의 for 반복문에서 사용되는 변수 i는 0으로 초기화된 후, 점차 그 값이 증가하며 arr 배열의 요소를 처음부터 끝까지 출력하게 된다. 여기서 변수 i의 기능을 추상화하여 일반화한 것을 Iterator 패턴이라 한다. Iterator는 반복자라고도하며 Iterator 패턴은 요소가 많이 있을 때 이를 순서대로 가리키며 전체를 검색하고 처리를 반복하는 것이다. 책장(BookShelf)에 책(Book)을 보관하는 행위를 Iterator 패턴을 이용해 구..
[Java] Boj 9012: 괄호
·
PS/Solve
문제https://www.acmicpc.net/problem/9012 풀이 괄호로 구성된 문자열이 주어지고, 해당 문자열의 괄호들이 짝이 맞게 구성되어 있는지 확인하면 되는 문제이다. 짝이 맞게 구성됨은 한 쌍의 괄호 "( )" 문자열로 문제에서 정의하고 있다. 여기서 "( )"를 기본 VPS라 하고, x가 VPS라면 문자열 "(x)" 역시 VPS이다. 그리고 두 VPS x와 y를 접합한 문자열 xy 역시 VPS에 해당한다. 따라서 "(())"은 VPS이며, "(()"나 "(())))"는 VPS가 아니다. 자료구조 강의 시간에 한 번은 들어보았을 괄호 검사 알고리즘을 구현하는 문제이다. 스택을 이용하여 쉽게 구현할 수 있는데, 현재 괄호가 '(' 라면 스택에 집어넣는다. 그리고 ')'를 만나면 스택에서..
[인공지능] Convolutional Neural Network 기초
·
CS/인공지능 & 머신러닝
CNN의 등장 배경 CNN(Convolutional Neural Network)의 등장 배경은 MLP의 단점에 있다. MLP는 Fully Connected 연산을 수행하게 되므로 파라미터의 수가 급격하게 증가하게 되고, 훈련 시간이 너무 많이 소요된다. 이외에도 영상의 특성 상 특정 픽셀은 주변 픽셀과 관련이 있는데, Fully Connected 연산을 수행하면 이러한 근처 픽셀의 상관관계인 지역성을 잃게 된다. 영상의 전체 관계를 고려하지 못하게 되어 입력 데이터의 변형에 매우 취약하며, 따라서 변형된 영상의 학습 데이터를 굉장히 많이 요구하게 된다. 이러한 Fully Connected 연산의 단점에 따라 CNN이 등장하게 되었다. CNN의 동작CNN의 동작은 그리 어렵지 않다. 특정 크기의 필터를 ..
[형식언어] 어휘분석 - 토큰과 정규 표현
·
CS/형식언어
토큰 (Token) 토큰(Token)이란, 문법적으로 의미 있는 최소 단위를 의미한다. 토큰은 대표 번호(Token Number)와 토큰의 수치, 혹은 string의 값(Token Value)을 가진다. 짧은 구문 'if ( a > 10 )'을 예시로 살펴보자. 'if ( a > 10)'은 토큰 if, (, a, >, 10, )으로 구성된 문장이다. 여기서 'if'는 키워드, '('는 구분자, 'a'는 변수 명, '>'는 연산자, '10'은 상수, ')' 역시 '('와 마찬가지로 구분자에 해당한다. 이렇게 분리된 토큰들은 토큰의 대표 번호와 토큰의 값을 가지고, 이 정보들이 Parser에 전달된다. 분리된 토큰들은 Token Type에 맞게 Parser에 토큰의 정보를 전달한다. Token Type이 (..
맵 디자인의 최고봉, 슈퍼 마리오 갤럭시
·
게임 분석
올해 10월, 슈퍼 마리오 갤럭시와 슈퍼 마리오 갤럭시 2가 스위치로 이식되어 출시되었다. 다운로드 버전은 10월 초, 패키지 버전은 10월 중순에 출시될 예정인데 이 슈퍼 마리오 시리즈, 정말 재미있을까? 슈퍼 마리오 갤럭시는 2008년 올해의 게임상, 메타크리틱 97점, 메타크리틱 WII 부문 베스트 게임즈 1위를 받으며 좋은 평가를 쓸어모았다. 그 시대에 WII를 가지고 있었다면 한 번은 해보았을 게임, 슈퍼 마리오 갤럭시를 한 번 뜯어보자. 슈퍼 마리오 갤럭시 이전 3D 마리오는 '슈퍼 마리오 선샤인 (2002)'이 있었다. '돌픽 섬'이라는 휴양지 분위기를 풀풀 풍기는 섬에서 어쩌면 밝은 분위기로 게임이 진행되었지만, '슈퍼 마리오 갤럭시'는 선샤인과는 시작부터 다른 분위기를 보인다. 백 년..
[Algorithm] 유니온 파인드 알고리즘
·
Algorithm
유니온 파인드 그래프 노드가 존재할 때, 노드들은 서로 연결되어 집합을 형성한다. 노드가 서로 연결되며 집합을 형성하는 것을 합집합 연산으로 간주할 수 있으며, 특정 노드가 어떤 집합에 속하였는지 궁금할 수 있다. 이때 사용할 수 있는 알고리즘이 유니온 파인드 알고리즘이다. union 연산은 각 노드가 속한 집합을 하나로 합치는 연산이며, find 연산은 특정 노드 a에 관해 노드 a가 속한 집합의 대표 노드를 반환하는 연산이다. 이때 find 연산을 활용해 특정 노드 a, b가 속한 집합의 대표 노드가 동일한지 비교하여 두 노드가 같은 집합에 속하였는지 확인할 수 있다. 유니온(union) 연산 초기 노드가 위와 같이 있다고 가정하자. 유니온 파인드 알고리즘은 일반적으로 1차원 배열을 이용해 해당..
[Java] Boj 14757: Dueling Philosophers
·
PS/Solve
문제https://www.acmicpc.net/problem/14757 풀이 위상 정렬과 관련된 문제로, 위상 정렬에 대해 아직 모른다면 블로그에 포스팅이 https://hyeon0117.tistory.com/84 있으니 확인하고 오길 바란다. [Algorithm] 위상 정렬(Topolgy Sort)위상 정렬 위상 정렬이란 사이클이 없는 유향 그래프에서 노드 순서를 찾는 알고리즘이다. 여기서 유향 그래프는 방향성이 있는 그래프를 의미한다. 위상 정렬은 사이클이 없는 그래프에서 사hyeon0117.tistory.com 위상 정렬 알고리즘의 동작 방식에 대해 물어보는 문제인데, 문제가 영어인지라 번역기를 이용해 문제를 해결하였다. 문제가 굉장히 길지만 물어보는 내용은 주어지는 그래프에서 위상 정렬 결과가 ..