ignore를 추가했는데 자꾸 계속 파일들이 추가될 때

git의 캐시문제 이므로 터미널을 열어서 캐시 삭제 후 다시 커밋하면 된다. 

git rm -r --cached .
git add .
git commit -m "remove source files"

 

 

 

추가로 git ignore파일에 추가할 내용을 쉽게 작성해주는 사이트

 

https://www.toptal.com/developers/gitignore

 

gitignore.io

Create useful .gitignore files for your project

www.toptal.com

사이트에 들어가서 현재 프로젝트에서 사용중인 개발 환경, 프로그래밍 언어등을 입력하면 자동으로 내용을 만들어 준다.

전체 복사해서 .gitignore 파일을 생성하면 된다. 

 

 

 

 

2020.3 버전을 다운받았다.

너무 오랜만에 켜서 이것저것 찾아보다가 Device Simulator라는 기능을 써보고 싶어 추가하려는데 난 도저히 찾을 수 없었다.

 

그러다가 발견했다.

 

Edit >Project Settings > Package Manager에 들어가서 이 두 개를 체크해줘야 Package Manager에서 Device Simulator가  보인다.

 

 

 

 

이제 Package Manager를 켜보면 (밑에 refresh list를 누르면) 이렇게 Device Simulator를 찾을 수 있다. 

 

 

 

 

 

 

 

참고 자료;

패키지 매니저의 변경사항 in Unity 2020.1 - IndieGameMaker (unity3dstudy.com)

 

패키지 매니저의 변경사항 in Unity 2020.1

유니티 2020.1 버전에서 많은 변화중 Package Manager는 몇가지 소소한 변화가 있다. 에셋스토어 뷰의 통합 유니티 2020 버전부터는 에셋스토어에서 구매한 에셋들을 Package Manager에서 직접 다운로드 및

unity3dstudy.com

 

 

 

 

타이머가 필요 없어졌다가 다시 공부해야겠다고 생각하니까 다시 필요해졌다. 

그래서 반년 하고도 2개월만에 다시.. 유니티를 켰다.

시간이 왜이렇게 빠른지 모르겠다. 세상에나

 

 


 

 

 

우선 버튼의 이미지를 바꿔줄 예정이다. 

이왕이면 예쁜 게 좋으니까 타이머를.. 꾸며 줄 것이다.

 

 

애셋스토어에서 귀여운 픽셀 아이콘을 가져왔다.

이 아이콘들로 버튼의 이미지를 대신할 것이다!

 

 

요 친구를 사용했다. 무료 아이콘 팩인데 구성물이 아주 귀엽다

 

 

혹시나 에셋스토어 들어가는 법?

더보기

 

상단 메뉴 바에 Window > Asset Store를 누르면 asset들을 구매하고 다운받을 수 있는 store에 들어갈 수 있다. 

 

 추가하면 이런식으로 창이 뜨는데 얘를 우측 클릭해서 maximize를 클릭하면 크게 볼 수 있다. 

물론 maximize는 다른 창들도 마찬가지로 적용된다. 

 

 

 

우선 버튼의 Image Component에서 기본 리소스로 설정된 UISprite이 아닌 내가 설정하고 싶은 아이콘인 이미지로 바꿔준다. 

 

 

 

 

 

아주 귀여워졌다

 

 

 

 

이제 Button Component에서는 마우스를 버튼에 올려 놓은 상태클릭이 끝난 상태, 기본 상태 이렇게 세 가지 상태로 나누어서 이미지를 설정할 것이다! 

 

 

Transition 부분을 보면 현재 default값은 Color Tint이지만 버튼의 상태에 따라서 sprite를 바꿔줄 생각이니 옵션 중 Sprite Swap으로 바꾼다. 

 

 

 

Highlighted : 마우스가 버튼 위에 올라가 있는 상태 (버튼을 누르지는 않고 있는 중) 

Pressed : 마우스가 클릭 된 상태 (버튼 누르고 있는 중)

Selected : 버튼이 클릭 된 상태 (버튼을 누르고 있지는 않는 중)

Disabled : 버튼이 비활성화된 상태

 

 

 

 

이렇게 나눠서 설정하고 나면 다음과 같은 버튼이 완성된다.

아주 귀엽다. 

 

 

마우스가 보이지 않는 것입니당. 테두리가 없으면 마우스가 올라가 있거나 버튼 누르고 있는 상태에요

 

 

이건 물론 스크립트로 해도 되고 EventTrigger라는 Component도 있지만 이 정도는 Button Component로도 충분하다. 

 

 

 

 

다음으로 하고 싶은 건 Stop 버튼을 눌렀을 때 밑에 내가 공부 타이머를 멈춘 로그를 찍고 싶다.

이 얘기는 무슨 얘기냐면 내가 만약 a월 b일 오후 3시부터 공부를 시작했다가 2시간 30분이 흐른 후 5시 반에 공부를 잠깐 쉬기 위해 stop을 눌렀다면 밑에 로그에는 다음과 같이 기록이 남았으면 좋겠다.

 

> a월 b일 오후 3시 ~ 5시 30분

 

이런식으로 로그가 계속 쌓이는 것이다. 내가 reset을 누르기 전까지!

그리고 save 버튼을 누르면 내 로그들이 txt파일로 저장되게 만들 것이다. 

 

이건 빠른 시일 내에 추가로 만들어야 하니까 (공부할 거면?ㅎ) (3) 포스팅으로 따로 올려야겠다. 

 

 

 

 

 

 

싱글톤

Singletone

 

 

 

싱글톤은 오직 한 개의 인스턴스만을 갖도록 보장해주며 해당 인스턴스를 전역에서 접근할 수 있는 메서드를 제공한다는 점에서 큰 장점을 제공한다. 

 

 

◎ 싱글톤을 사용하는 이유

1. 한 번도 사용하지 않으면 아예 인스턴스 자체를 생성하지 않는다.

처음 사용될 때 초기화되므로 사용되지 않으면 아예 초기화 되지도 않는다.

 

2. 런타임에 초기화된다.

애초에 전역으로 접근하기 위해 정적 클래스를 사용하기도 하지만 정적 멤버 변수는 컴파일러가 main 함수를 호출하기 전에 초기화하기 때문에 프로그램 실행 후에 알 수 있는 정보들은 활용할 수 없다.따라서 싱글톤을 이용하면 1번과 같이 사용할 때 초기화가 되므로 원하는 시점에서 초기화 하여 사용할 수 있다.

 

3. 싱글톤을 상속할 수 있다.

C# 같은 경우는 제네릭 클래스를 이용해 싱글톤을 상속받아 사용하는 방식도 많이 사용한다. 

 

4. 메모리 낭비 방지

한번의 new로 고정된 메모리 영역을 얻어 인스턴스를 사용하기 때문에 메모리 낭비를 방지할 수 있다.

 

 

◎ 싱글톤의 문제는?

싱글톤의 전역에서 접근할 수 있다는 장점은 곧 단점이 되기도 한다.

 

1. 버그 관리가 힘들 수 있다.

만약 싱글톤으로 호출한 함수에 버그가 있으면 해당 함수 뿐 아니라 해당 함수를 호출한 모든 부분을 확인해야 한다.

 

2. 커플링을 조장한다.

커플링이란 결합도를 뜻한다. 코드는 다른 코드들과의 의존성이 낮을 수록 좋다. 하지만 커플링은 하나의 모듈이 다른 모듈의 내부 데이터를 직접 접근할 때 발생하며, 다른 부분의 내용을 수정할 수 있게 된다. 

싱글톤을 이용하면 코드를 짜면서 나도 모르게 의존성이 높은 코드를 짜게 된다. 

 

3. 멀티스레딩 같은 동시성 프로그래밍에 알맞지 않다

무언가를 전역으로 만들면 모든 스레드가 보고 수정할 수 있는 메모리 영역이 생기게 되는 것이다. 다른 스레드가 전역 데이터에 무슨 작업을 하는지 모를 때도 있다. 그러다 보면 교착상태, 경쟁상태 등 찾기 어려운 스레드 동기화 버그가 생기기 쉽다. 

 

 

 

 

참고 자료;

더 빠르고 깔끔한 게임 코드를 구현하는 13가지 디자인 패턴 게임 프로그래밍 (저; 로버트 나이스트롬 , 역; 박일, 출판사; 한빛미디어)

programmers.co.kr/learn/courses/30/lessons/43105

 

코딩테스트 연습 - 정수 삼각형

[[7], [3, 8], [8, 1, 0], [2, 7, 4, 4], [4, 5, 2, 6, 5]] 30

programmers.co.kr

 

 

앞서 풀었던 문제 중 땅따먹기와 개념이 비슷한 문제이다. 

 

int Find_max(int n1, int n2)
{
	return n1 > n2 ? n1 : n2;
}

int solution(vector<vector<int>> triangle) {
	int answer = 0;

	int triangle_size = triangle.size();

	for (int i = 0; i < triangle_size-1; ++i)
	{
		for (int j = 0; j < triangle[i+1].size(); ++j)
		{
			if (j < 1 || (j == triangle[i + 1].size() - 1))
			{
				// 왼쪽 끝// 오른쪽 끝 
				if (j < 1)
				{
					triangle[i + 1][j] += triangle[i][0];
				}
				else
				{
					triangle[i + 1][j] += triangle[i][j-1];
				}
				
			}
			else
			{
				triangle[i + 1][j] += Find_max(triangle[i][j - 1], triangle[i][j]);
			}
		}
	}
	
	answer = triangle[triangle_size - 1][0];
	for (int i = 1; i < triangle[triangle_size - 1].size(); ++i)
	{
		if (answer < triangle[triangle_size - 1][i])
		{
			answer = triangle[triangle_size - 1][i];
		}
	}

	return answer;
}

 

 

programmers.co.kr/learn/courses/30/lessons/12913

 

코딩테스트 연습 - 땅따먹기

땅따먹기 게임을 하려고 합니다. 땅따먹기 게임의 땅(land)은 총 N행 4열로 이루어져 있고, 모든 칸에는 점수가 쓰여 있습니다. 1행부터 땅을 밟으며 한 행씩 내려올 때, 각 행의 4칸 중 한 칸만 밟

programmers.co.kr

 

처음에는 단순히 뇌빼기를 하고 풀어도 되는 쉬운 문제인 줄 알고 이전값만 더했는데 테스트에서 실패가 뜨는 것을 보고 직감했다. 이게 아니구나.

그래서 다른 방식으로 풀었다. 

원래는 각 행에 가장 큰 값을 더하되 이전 행에서 더했던 인덱스(열)면 다른 최댓값을 찾았었다.

그런데 생각해보니 반례가 있었다.

1 2 3 4
5 6 8 7
9 10 11 12
1 1 3 1000

 

이렇게 극한으로 치닫는 예제에서 4->8->12를 하고나면 마지막행에서 1000을 더할 수가 없게 된다.

그래서 각 행에 이전 행의 최댓값을 더한 후에 비교해줬다. 

 

 

int find_max(int n1, int n2, int n3)
{
	int temp = n1;

	if (temp < n2)
	{
		temp = n2;
	}
	if (temp < n3)
	{
		temp = n3;
	}
	return temp;
}


int solution(vector<vector<int> > land)
{
	int answer = 0;
	int m_size = land.size();

	for (int i = 0; i < m_size-1; ++i)
	{
		land[i+1][0]+= find_max(land[i][1], land[i][2], land[i][3]);
		land[i+1][1]+= find_max(land[i][0], land[i][2], land[i][3]);
		land[i+1][2]+= find_max(land[i][0], land[i][1], land[i][3]);
		land[i+1][3]+= find_max(land[i][1], land[i][2], land[i][0]);
	}

	answer = land[m_size - 1][0];
	for (int i = 1; i < 4; ++i)
	{
		if (answer < land[m_size - 1][i])
		{
			answer = land[m_size - 1][i];
		}
	}
	return answer;
}

 

programmers.co.kr/learn/courses/30/lessons/12973

 

코딩테스트 연습 - 짝지어 제거하기

짝지어 제거하기는, 알파벳 소문자로 이루어진 문자열을 가지고 시작합니다. 먼저 문자열에서 같은 알파벳이 2개 붙어 있는 짝을 찾습니다. 그다음, 그 둘을 제거한 뒤, 앞뒤로 문자열을 이어 붙

programmers.co.kr

 

효율성 테스트까지 통과하기 위해서는 Stack을 이용해서 풀어야 한다.

괄호 { } 맞추기 문제, 그리고 카카오 테스트 중에 크레인 인형 뽑기와 비슷했던 문제였다.

stack의 top과 s의 idx값을 비교했을 때 같으면 stack의 top을 pop하고 같지 않다면 s의 idx값을 현재 stack에 넣어준다. 

 

 

#include <iostream>
#include<string>
#include <stack>
using namespace std;
int solution(string s)
{
	int answer = 0;
	stack<char> Stack;

	int idx = 0;

	Stack.push(s[idx++]);

	while (idx < s.size())
	{
		if (Stack.empty())
		{
			Stack.push(s[idx++]);
		}
		char s_top = Stack.top();

		if (!Stack.empty() && s_top == s[idx])
		{
			Stack.pop();
		}
		else
		{
			Stack.push(s[idx]);
		}
		idx += 1;

	}

	if (Stack.empty())
		answer = 1;
	else
		answer = 0;

	return answer;
}

 

 

이분탐색

이진탐색

 

 

 

처음부터 하나하나 값을 비교하는 순차탐색과 달리 이분탐색은 데이터를 찾을 때 검색 대상의 데이터를 반 씩 줄여나가면서 자료를 찾는 방법을 말한다.

 

◎ 이진탐색?

이분탐색에는 중요한 조건이 있는데, 바로 데이터가 정렬된 상태여야 한다는 것이다.

왜일까?

 

이분탐색은 데이터를 반씩 줄여 나가는 방식은 다음과 같다.

 

총 n개의 데이터가 있다고 했을 때

1. 중심 값(mid = (n+1)/2)을 잡는다

2. 중심 값(mid)과 찾으려는 값(value)을 비교.

3-1. mid == value => 탐색 종료. value의 값은 mid

3-2. mid > value => 중심값을 기준으로 왼쪽 값을 기준으로 다음 탐색을 진행한다. 즉 오른 쪽의 데이터는 더 이상 확인하지 않는다.

3-3. mid < value => 중심값을 기준으로 오른쪽 값을 기준으로 다음 탐색을 진행한다. 즉 왼쪽의 데이터는 더 이상 확인하지 않는다. 

4. 데이터가 1개 남을 때까지 반복한다. 

 

 

1 2 3 4 5 6 7

이렇게 7개의 데이터를 가진 배열이 있을 때 5를 찾고 싶으면 우선 배열의 가장 가운데 값을 기준으로 잡는다.

그 다음 찾으려는 값이 가장 가운데 값과 같으면 탐색이 끝나는 것이고 크면 오른쪽, 작으면 왼쪽을 확인한다.

5를 찾고 싶으니 중심인 4를 기준으로 오른쪽 값을 비교할 것이다. 그러면 1,2,3은 더 이상 비교하지 않아도 되므로 다음 탐색에서는 대상이 3개로 줄어들게 된다.

이런식으로 비교할 데이터가 1개가 남을 때까지 반복한다. 

 

 

계속 탐색 대상의 데이터를 반으로 줄여나가므로 이분탐색의 시간 복잡도는 O(logn)이 된다. 

 

 

 

 

◎ 라이브러리

#include <algorithm> 헤더를 추가하면 이미 구현된 이분 탐색을 사용할 수 있다.

 

binary_search ( begin, last, val);


iterator의 begin값과 end값, 찾을 value값을 순서대로 넣어주면 사용이 가능하다. 

 

 

 

+ Recent posts