전체 글 267

[백준] 1316 with C++

문제설명 입출력 예제 개념 연속된 문자가 나타났을 때, 그 사이에 교차되는 문자가 있는지 확인하는 문제다. 이를 그림으로 나타내면 다음과 같다. 따라서 반복되는 문자열을 모두 지웠을 때 같은 문자가 존재한다면 그룹단어가 아니게 된다는 것을 이용하면 된다. 풀이 #include #include #include using namespace std; int main() { int num = 0; cin >> num; int cnt = 0; 단어의 개수를 num으로 받고, 그룹 단어 개수를 출력할 cnt를 초기화한다. for (int i = 0; i > str; bool check = true; str.erase(unique(str.begin(), str...

Algorithm/백준 2023.02.18

[백준] 2941 with C++

문제설명 입출력 예제 개념 문자열을 크로아티아 알파벳의 규칙에 맞게 변경한 후, 그 개수를 카운팅 하는 문제다. 크로아티아 문자가 생성되는 규칙은 다음과 같다. 문자 =가 있는 경우 이전 문자가 c거나 s인 경우 카운트를 2개가 아닌 하나로 한다. 이전 문자가 z인 경우 카운트를 2개가 아닌 하나로 한다. 이전 문자가 z이며 d인 경우 카운트를 3개가 아닌 하나로 한다. 문자 -가 있는 경우 이전 문자가 c거나 d인 경우 카운트를 2개가 아닌 하나로 한다. 문자 j가 있는 경우 이전 문자가 l이거나 n이 경우 카운트를 2개가 아닌 하나로 한다. 풀이 #include #include using namespace std; int main() { string str; cin >> str; int count =..

Algorithm/백준 2023.02.17

[백준] 4673 with C++

문제설명 입출력 예제 개념 생성자가 없는 숫자인 셀프 넘버를 출력하는 문제다. 문제에서 알 수 있듯이 x라는 숫자가 있을 때, x의 각 자릿수들의 숫자와 x를 더한 숫자는 셀프 넘버가 아니게 된다. 따라서 bool 배열은 만들어 1부터 10000까지 상술한 규칙을 적용해, 해당하는 자리의 숫자를 true로 바꾼 후 false만 출력하면 된다. 풀이 풀이(1) string 이용하기 #include #include using namespace std; int main() { int num = 10000; bool selfnum[10000] = { false }; max 숫자인 10000을 num으로 초기화하고, selfnum를 체크할 bool 배열 selfnum[]을 초기화한다. for (int i = 1;..

Algorithm/백준 2023.02.16

[유니티] 방향, 크기, 회전 (1)

벡터 수학 벡터의 정의와 좌표의 의미 유니티에서 벡터를 이해하는 것은 매우 중요하다. 벡터(Vector)란 일반적으로 크기와 방향을 가진 물리량으로 정의하지만, 세 가지 관점으로 넓혀서 정의할 수 있다. 공간상의 화살표로서의 벡터 나열된 숫자 데이터를 묶는 단위로서의 벡터 벡터 연산을 만족하고 정해진 개수의 원소를 가지는 벡터 일반적으로 게임 개발에서 벡터는 주로 위치, 방향, 속도를 나타낼 때 사용된다. 이를테면 위치를 표현하기 위한 Vector3(0, 1, 1)은 어떤 물체가 x = 0, y = 1, z =1의 위치에 존재한다고 해석할 수 있다. 이를 유니티의 메서드인 DrawLine을 이용해 그려보자. Debug.DrawLine()은 start와 end 사이를 선으로 그려주는 메서드다. 이를 이용하..

Game/Unity 2023.02.15

[자료구조] vector with C++ (2)

std::vector 구현  이제부터 vector를 간단하게 구현해 보겠다. 우리의 목적은 크기가 유동적으로 조절되는 배열을 만드는 것이고, 용량은 1.5배씩 늘리도록 하겠다. #include using namespace std;templateclass vector{ T* _data = nullptr; // 데이터의 주소값 int _size = 0; // 크기 int _capacity = 0; // 용량 먼저 벡터에 담을 데이터의 주솟값과, 크기, 용량 변수를 초기화해준다. public: vector() { } // 기본 생성자 ~vector() // 소멸자 { if (_data) // 소멸자가 실행될 때 벡터 내에 데이터가 존재하면 delete[] _data; // 할당 해제 } 기본 생성자를 만..

CS/자료구조 2023.02.11

[자료구조] vector with C++ (1)

std::vector 지난 시간에 크기가 고정되는 배열 std::array에 대해 살펴보았다. 예고한 것처럼 C 스타일의 배열의 한계를 극복한 가변 크기 배열 std::vector에 대해 알아보자. 벡터는 Cpp reference에 다음과 같이 정의되어 있다.   직역하자면 연속적으로 저장되는 가변 배열이라는 의미다. 즉, 연속된 자료구조이며 크기를 늘리거나 줄여 원소를 변경할 수 있는 배열이라고 생각하면 되겠다. 이러한 벡터를 사용하기 위해서는 vector 라이브러리를 받아와서 다음과 같은 형태로 사용하면 된다. #include #include using namespace std;int main(){ vector v = { 1,2,3,4,5 }; // 크기가 5인 int형 가변 배열 vect..

CS/자료구조 2023.02.10

[유니티] 유니티 엔진 원리

상속 게임 엔진은 이미 완성된 기반 코드를 제공한다. 지금까지 포스팅해온 게시글을 움직이는 것(translate)과 충돌하는 것(OnTrigger)과 같이 이미 작성된 코드를 재사용하여 게임을 만들었다. 이러한 '재사용'과 관련이 깊은 키워드는 바로 상속이다. 하지만 유니티 엔진에서는 이러한 상속을 유니티를 동작시키는 데 있어 핵심이라고 부르진 않는다. 왜 그럴까? 바로 상속의 한계 때문이다. 게임을 만들 때 상속의 한계는 명확하다. 상속에 의존하다보면 오히려 코드의 재사용이 힘들어지고, 추후에 자식 클래스와 부모 클래스의 기능이 충돌하는 등 더욱 번거로워지기 때문이다. 예를 들어보자. RPG 게임에서 플레이어와 NPC, Monster를 상속을 이용해 만든다고 가정해보면, 이들의 기반인 Human 클래스..

Game/Unity 2023.02.09

[프로그래머스] n^2 배열 자르기 with C++

문제 설명 제한 사항 및 입출력 예제 알고리즘 개념 알고리즘(1) 정해진 규칙에 의해 생성되는 배열의 일부분을 출력하는 문제다. 제한사항을 보면 n과 left, right의 값이 상당히 크므로 시간 초과를 주의해야 한다. 즉, 배열을 초기화하려면 시간 복잡도가 O(n^2)이 될 텐데, O(n)으로 줄이는 것을 목표로 하자. 그렇다면 우리는 배열의 규칙성을 찾아 left와 right 사이의 인덱스 값을 통해 바로 배열의 값을 구해야 한다. 이를 구하기 위해 예제에 나와 있는 n = 3의 배열을 시각화해 보자. 어떤 규칙성이 보이는가? 먼저 확인할 수 있는 것은 다음과 같다. 행이 바뀔 때마다 첫 번째 행을 기준으로 일련의 규칙에 따라 값이 바뀐다. 다음 사진에서 기준인 값은 1, 2, 3이다. 이 값을 기..

[유니티] 프리팹(Prefabs)과 감지(Detection), 충돌(Collision) (2)

목표 - 프리팹의 개념을 이해하고 프리팹 인스턴스를 생성하기. - 프리팹화된 몹들을 감지하기. 충돌(Collision)과 감지(Detection) 게임을 하다 보면 몹의 특정 범위 내에 들어와서 공격을 받는 상황을 겪어보았을 것이다. 예를 들어보자. 타워 디펜스류 게임을 할 때 타워가 설치되고 몹을 인식하기 전까진 아무런 행동을 하지 않다가, 몹이 범위 안에 들어오면 공격을 하기 시작하는 것을 예로 들 수 있겠다. 이렇게 몹을 감지하고 공격하는 행동은 어떻게 해야 구현이 될까? 공격을 하기 위해선 몹을 감지하는 것이 우선이겠다. 여기서 감지(Detection)란 말 그대로 범위 내에 특정 오브젝트를 인식하는 것을 의미한다. 유니티에서는 감지를 하기 위해 자주 사용하는 것이 있는데, 바로 충돌(Collis..

Game/Unity 2023.02.01