336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.



[엑셀] 다른 시트 값 가져오기


우선 아래 그림 처럼 원본시트(OriginData 시트)와 대상시트(ExportData) 두개를 만듭니다.


그리고 원본 시트에 값을 입력합니다.


저 같은 경우 테스트로 아래처럼 하였습니다.



원본시트에 값이 입력 되었으면, 대상 시트로 이동을 합니다.


저같은 경우 첫행은 키값으로 사용하기 때문에 


첫행의 이름은 직접 입력을 해주었습니다.


그럼 원본시트 값을 가져오기 위해 A2를 선택합니다.


그리고 =시트명!셀 을 해줍니다.


저의 경우 =OriginData!A2 가 되겠네요.



값이 제대로 들어왔다면 행/열로 쭉 끌어서 모두 채워넣습니다.


다음처럼 모든값이 적용되었습니다.



간단한건데 자주 사용을 하지 않으니 깜빡깜빡하네요. 


도움되셨길 바래요.

'게임 프로그래밍 > 엑셀' 카테고리의 다른 글

[엑셀]VBA를 이용해 CSV를 UTF-8로 Export하기  (0) 2016.05.22
[엑셀]VLOOKUP 사용하기  (0) 2016.05.22
[엑셀]엑셀 드롭다운 만들기  (0) 2016.05.22
[엑셀]이름 정의  (2) 2016.05.22
[엑셀] xml 만들기.  (5) 2015.09.10
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.



삽입정렬(Insertion Sort)



삽입정렬(Insertion Sort) 알고리즘은 


배열의 모든 데이터들을 앞에서부터 차례대로 정렬시키면서 나아가는 방식입니다.


즉, 앞에서부터 차례대로 정렬해 나간다고 보면 되겠습니다.


위키 참고하면 많은 도움이 되실꺼에요. <- 클릭하면 이동합니다.


위키를 보시면 memcpy()를 사용했을 때 25~30% 빠르게 처리된다고 합니다.


삽입정렬 알고리즘의 작동 과정은 다음과 같습니다. (Swap을 하여 처리하는 경우입니다)


< [ 4, -8, 3, 1 ] 정렬 >


위 그림을 보시면 앞에서부터 정렬이 되어 갑니다.


이렇게 순차적으로 정렬을 해 나가면서, 


자신과 비교후 조건이 충족되면 자기 자신을 앞에다 삽입을 합니다.


위를 코드로 보시면 다음과 같습니다.


< C++ 코드 >


#include 
using namespace std;

void insertionSort(int arr[], int length)
{
	int i, j, tmp;
	for(i = 1; i < length; i++)
	{
		j = i;
		while(j > 0 && arr[j - 1] > arr[j])
		{
			tmp = arr[j];
			arr[j] = arr[j - 1];
			arr[j -1] = tmp;
			j--;
		}
	}
}

int main()
{
	int values[] = {4, -8, 3, 1};

	cout << "Before sorting" << endl;
	for(int i = 0; i < 4; i++)
	{
		cout << values[i];
		if(i < 3)
			cout << ", ";
		else 
			cout << endl;
	}

	// sort
	insertionSort(values, 4);
	cout << "After sorting" << endl;
	for(int i = 0; i < 4; i++)
	{
		cout << values[i];
		if(i < 3)
			cout << ", ";
		else 
			cout << endl;
	}
}




< 결과 >


잘못된 부분이 있으면 언제든 리플해주시기 바랍니다.


참고 : http://www.algolist.net/Algorithms/Sorting/Insertion_sort

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.



선택정렬(Selection Sort)



선택 정렬(Selection Sort)은 버블정렬(Bubble Sort)와 같은 시간복잡도(O(n2))를 가지지만, 


버블 정렬과는 조금 달리 불안정(Unstable)한 알고리즘 입니다. 무슨말이냐면, 


예를 들어 {8, 7, 5, 5, 6} 이 있을 경우 정렬한 후에 5와 5의 위치가 바뀔수도 있다는 거랍니다.


즉, 같은 내용을 가지는 키 값들이 정렬 후에도 순서가 유지되는걸 말합니다.


선택정렬은 다음과 같은 과정을 거칩니다.


< [ 8, 2, -1, 5, 4 ] 선택정렬 >


선택 정렬(Selection Sort) 알고리즘은 최초 한 값을 선택하고, 다른 값들과 비교한 후 작은 값이 있으면


그 값을 저장하고 마지막까지 갔다면, 최초 선택한 값과 스왑하는 방식입니다.


글로 쓰니까 어렵네요. 그림이 도움이 될꺼에요.(시간상 2, 3회전은 스킵하였습니다)


< C++ 코드 >

#include 
using namespace std;

void selectionSort(int arr[], int n)
{
	int minIndex = 0;
	for(int i = 0; i < n -1; i++)
	{
		minIndex = i;
		for(int j = i + 1; j < n; j++)
		{
			if(arr[minIndex] > arr[j])
				minIndex = j;
		}

		if( minIndex != i)
		{
			int temp = arr[minIndex];
			arr[minIndex] = arr[i];
			arr[i] = temp;
		}
	}
}

int main()
{
	int values[] = {8, 2, -1, 5, 4};

	cout << "Before sorting" << endl;
	for(int i = 0; i < 5; i++)
	{
		cout << values[i];
		if(i < 4)
			cout << ", ";
		else 
			cout << endl;
	}

	// sort
	selectionSort(values, 5);
	cout << "After sorting" << endl;
	for(int i = 0; i < 5; i++)
	{
		cout << values[i];
		if(i < 4)
			cout << ", ";
		else 
			cout << endl;
	}
}


< 결과 >

참고 : http://www.algolist.net/

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

버블정렬(Bubble Sort)


기본적으로 가장 간단한 정렬이라 생각이 듭니다.

앞 뒤를 비교해서 우선순위를 정해 교체하는 알고리즘이죠.

버블정렬(Bubble Sort)의 시간복잡도는 O(n2)가 됩니다. 분기문을 두번 돌아야 하니까요.

{3, 2, 5, 4, 1} 을 버블정렬을 통해 정렬을 하면 다음과 같은 과정을 거치게 됩니다.


< [ 3, 2, 5, 4, 1] 정렬 >


녹색은 이미 정렬된 상태이므로 그대로 두고, 빨간색은 교체(스왑) 시켜줍니다.

그리고 주황색은 이미 정렬된 상태로 건드리지 않는다는 의미 입니다.


< C++ 코드 >


#include 
using namespace std;

void bubbleSort(int arr[], int n)
{
	bool swapped = true;
	int j= 0;
	int tmp = 0;
	while(swapped)
	{
		swapped = false;
		j++;
		for(int i = 0; i < n - j; i++)
		{
			// 이 조건을 변경하여 오름차순, 내림차순을 설정합니다.
			if(arr[i] < arr[i+1])
			{
				tmp = arr[i];
				arr[i]= arr[i + 1];
				arr[i + 1]= tmp;
				swapped = true;
			}
		}		
	}
}

int main()
{
	int values[5] = {3,2,5,4, 1};

	cout << "Before sorting" << endl;
	for(int i = 0; i < 5; i++)
	{
		cout << values[i];
		if(i < 4)
			cout << ", ";
		else 
			cout << endl;
	}

	// sort
	bubbleSort(values, 5);
	cout << "After sorting" << endl;
	for(int i = 0; i < 5; i++)
	{
		cout << values[i];
		if(i < 4)
			cout << ", ";
		else 
			cout << endl;
	}
}


< 결과 >


참고 : http://www.algolist.net/Algorithms/Sorting/Bubble_sort

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

주로 Swap을 하게되면 다음과 같은 방법으로 하게됩니다.


< 임시변수를 두고 교체하는 알고리즘 >


void swapB(int &x, int &y)
{	
	int temp = x;
	x = y;
	y = temp;
}


그러나 임시변수를 두지 않고, XOR(비트연산)을 이용하는 방법도 있습니다.

XOR 연산은 두 값의 각 자리수를 비교해, 값이 다르면 1로, 그렇지 않으면 0으로 계산합니다.

< 5와 3의 XOR 예 >


또한 XOR 연산은 다음과 같은 성질을 갖습니다. (출처 : 위키)

  • L1. 교환법칙A \otimes B = B \otimes A
  • L2. 결합법칙(A \otimes B) \otimes C = A \otimes (B \otimes C)
  • L3. 항등원의 존재: 어떤 A에 대하여서도, A \otimes Z = A가 되는 값 Z = 0이 존재한다.
  • L4. 각 원소에 대해 유일한 역원의 존재: 각 A에 대하여, A \otimes A^{-\!1} = Z가 되는 A^{-\!1}가 존재한다.
  • L4a. 각 원소의 역원은 사실 자기 자신임: A \otimes A = 0


C++에서 XOR는 ^ 로 표현합니다.


< XOR을 이용한 교체 알고리즘 >


void swapA(int *x, int *y)
{
	if (x != y)
	{
		*x ^= *y;
		*y ^= *x;
		*x ^= *y;
	}
}


간단히 확인해 보기 위하여 1과 2 교체를 해보도록 하겠습니다.




< 전체 코드 >


#include 
using namespace std;

void swapA(int *x, int *y)
{
	if (x != y)
	{
		*x ^= *y;
		*y ^= *x;
		*x ^= *y;
	}
}

void swapB(int &x, int &y)
{	
	int temp = x;
	x = y;
	y = temp;
}

int main()
{
	int x = 1, y = 2;
	cout << "SwapA" << endl;
	cout << "Initial value : x = " << x << ", y = " << y << endl;
	swapA(&x, &y);
	cout << "swap value : x = " << x << ", y = " << y << endl << endl;
	cout << "SwapB" << endl;
	cout << "Initial value : x = " << x << ", y = " << y << endl;
	swapB(x, y);
	cout << "swap value : x = " << x << ", y = " << y << endl;
}


< 결과 >



실제 XOR을 이용한 방법은 요즘 프로세서에서 임시변수를 두고 사용하는게 더 빠르다고 합니다.(자세한건 위키로)


이런 방법도 있다는것만 알면 될듯 하네요. 


도움되셨길 바랍니다.



336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

보글(Boggle) 게임은 NxM 크기의 알파벳 격자를 가지고 하는 게임인데,

목적은 상하좌우 / 대각선으로 인접한 칸들의 글자들을 이어서 단어를 찾아내는 것입니다.


(테스트를 위해 전체를 검색하여 존재하는지 여부 판단하도록 함)



// 상하좌우/대각선으로 인접한 칸들의 글자들을 이어서 단어를 찾아내는 문제.
/* 예를 들어
Y O S
H E K
Q Z W

인 경우 YES를 찾으면 {0, 0}, {1, 1}, {2, 0}을 순서대로 찾으면 된다.

예제의 경우 특정 위치에서 시작하지 않고, 해당 단어가 있는지 판단만 하도록한다.
*/

#include 
#include 
#include 
using namespace std;

class Boggle
{
public:
	// 게임판 정보
	vector board;

	Boggle()
	{
		// 게임판 세팅
		board.push_back("URLPM");
		board.push_back("XPRET");
		board.push_back("GIAET");
		board.push_back("XTNZY");
		board.push_back("HOQRS");
	}

	// 5x5 게임판에서 주어진 단어가 시작하는지 반환.
	bool hasWord(int x, int y, const string& word)
	{
		// 범위를 넘어가면 실패.
		if (x < 0 || y < 0 || x >= 5 || y >= 5) return false;
		// 단어의 첫번째가 안맞으면 실패;
		if (board[x][y] != word[0]) return false;
		// 단어의 첫번째가 맞았는데 길이가 1이면 성공.
		if (word.size() == 1) return true;
		// 현재 위치 중심으로 주변을 검색한다.
		for (int dx = -1;  dx <= 1; dx++)
		{
			for (int dy = -1; dy <= 1; dy++)
			{
				if (hasWord(x + dx, y + dy, word.substr(1)))
					return true;
			}
		}
		return false;
	}
};

int main()
{
	Boggle boggle;

	string target = "";
	cout << "찾을 문자열 입력" << endl;
	cin >> target;
	bool bFound = false;

	for (int x = 0; x < 5; x++)
	{
		for (int y = 0; y < 5; y++)
		{
			if (boggle.hasWord(x, y, target))
			{
				bFound = true;
				break;
			}
		}

		if (bFound)	break;
	}

	cout << "찾을 문자열 " << target << " 존재 : " << (bFound ? "YES" : "NO") << endl;

	system("pause");
}




< 결과 >


 알고리즘문제해결전략


336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

엑셀 xml 만들기 (MS Office 2010기준)


엑셀을 사용하는데 xml로 변환할 일이 생겨서 이곳저곳 찾아봤네요.

찾아본 결과 중 가장 쉬운걸로 포스팅 하려고 합니다.

사실 맞는 방법인지는 모르지만 작동은 되니까.


Step 1. xml로 만들 엑셀 시트 구성하기.

테스트는 아주 쉽게 다음처럼 하겠습니다.

참고 : 여기에서 id와 value라는 이름 다른걸로 하셔도 됩니다.



Step 2. xml 스키마 만들기

스키마는 엑셀에서 만든거와 구조가 같게끔 하고, 최소 두개 이상 써야 합니다.

아래 보시면 Field를 두개 넣었습니다.

두개 이상이 되어야 반복 되는걸 인식한다고 하더라구요.

그리고 엑셀에서 만든 필드 이름과 같아야 자동 매칭 기능도 된다고 합니다.

이렇게 했다면 test.xml 로 저장하겠습니다.


<?xml version="1.0" encoding="utf-8" standalone="yes" ?>

<MyTest>

  <Field id="" value=""/>

  <Field id="" value=""/>

</MyTest> 




Step 3. 엑셀에 xml스키마 맵핑하기

다시 엑셀로 돌아갑니다.

첫번째로 해야할 게 xml 내보내기 할 수 있는 메뉴를 보이게 하는거에요.

파일->옵션을 눌러 줍니다.



옵션 창이 뜨면 리본 사용자 지정을 선택하고 개발 도구를 체크 해준다음에 확인을 눌러줍니다.



개발 도구 메뉴가 생겼습니다. 이제 실제 맵핑 할 차례.

개발 도구를 선택하고, 원본을 눌러 줍니다.

그리고 XML맵을 눌러줍니다.


추가를 누르면 탐색기가 열리는데 아까 만든 "test.xml" 을 열어줍니다.

그러면 다음처럼 등록이 되는게 보여요. 그리고 확인을 눌러줄께요.



그러면 우측에 MyTest라는게 생겨났네요.

맵핑이 거의 끝나가네요.



이제 좌측 Sheet에서 모두 선택해주세요.

그리고 우측 MyTest에서 우측마우스를 눌러 요소 매핑을 눌러줍니다.



그럼 맵핑할 위치를 선택하라고 나오는데 확인을 눌러줍니다.


그러면 다음처럼 변합니다. 이렇게 변하면 완료가 된거에요.



Step 4. xml로 내보내기(Export)

개발도구 메뉴에서 내보내기를 눌러 저장하면 완료됩니다.



xml로 저장한 파일을 열어보니 다음처럼 잘 나오네요.




엑셀을 xml로 만들기 어렵지 않네요. 


도움 되셨길 바래요~





336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

n개의 원소 중 m개를 고르는 모든 조합을 찾는 알고리즘.



// n개의 원소 중 m개를 고르는 모든 조합을 찾는 알고리즘.

/*
예를 들어 N이 7이면 (0, 1,2, 3), (0, 1, 2, 4), (0,1, 2, 5), ....(3, 4, 5, 6).. 이다.

만약 m이 5개면? for문 5번해야함;; 뭔짓임.
*/

void UseFor(int n)
{
	for (int i = 0; i < n; i++)
	{
		for (int j = i + 1; j < n; j++)
		{
			for (int k = j + 1; k < n; k++)
			{
				for (int l = k + 1; l < n; l++)
				{
					cout << i << " " << j << " " << k << " " << l << endl;
				}
			}
		}
	}
}

/*
n: 전체 원소의 수
picked : 지금까지 고른 원소들의 번호
toPick : 더 고를 원소의 수
*/
void pick(int n, vector& picked, int toPick)
{
	if (toPick == 0)
	{
		for (int nIndex = 0; nIndex < picked.size(); ++nIndex)
		{
			cout << picked[nIndex] << " ";
		}

		cout << endl;
		return;
	}

	// 고를 수 있는 가장 작은 번호를 계산한다.
	int smallest = picked.empty() ? 0 : picked.back() + 1; 

	// 이 단계에서 원소 하나를 고른다.
	for (int next = smallest; next < n; ++next)
	{
		picked.push_back(next);
		pick(n, picked, toPick - 1);
		picked.pop_back();
	}
}

int main()
{
	int n = 10;

	//UseFor(n);

	vector v;
	pick(n, v, 8);

	getchar();

	return 0;
}


[ 결과 ]



336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

1부터 N까지 합을 구하는 알고리즘.


ex> 1부터 1000까지 합을 구하라.



// 1부터 N까지 합을 계산하는 반복 함수와 재귀함수.

int MethodA(int n);
int MethodB(int n);

int main()
{
	int n = 1000;

	printf("분기문 : %d\n", MethodA(n));

	printf("재귀 : %d\n", MethodB(n));

	getchar();

	return 0;
}

// 일반적인 For문
int MethodA(int n)
{
	int ret = 0;
	for (int nIndex = 0; nIndex <= n; nIndex++)
	{
		ret += nIndex;
	}

	return ret;
}

// 재귀함수 ㅣ용
int MethodB(int n)
{
	if (n == 1) return n;
	else return n + MethodB(n - 1);
}




[ 결과 ]




336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

안드로이드 세팅. (2015-09-02 기준)



Step 1. Android SDK 설치하기.

다음 사이트로 이동한다.

http://docs.unity3d.com/Manual/android-sdksetup.html

그러면 다음처럼 화면이 나오는데, 표시해둔 곳을 클릭한다.


그리고 다음처럼 STAND-ALONE SDK TOOLS를 선택한다.

참고 : ANDROID STUDIO 설치하셔두 됩니다. 저는 ANDROID STUDIO툴이 필요 없으니 SDK만 받도록 하겠습니다.

그리고 download the SDK now를 선택.



자신의 운영체제에 맞는 버전을 선택하세요. 저는 Windows니까 저걸 받아요. 

참고 : Installer로 설치할께요. 압축 풀어서 해도 되는데 환경변수(아마도) 설정해줘야 될거에요.



다운이 완료되면 설치합니다.

설치가 끝나면 SDK Manager 실행 할래요? 하는데 Yes하세요.


Step 2. Android SDK 필요한거 받기.

매니저가 실행 되면 다음처럼 설치가 아직 안된 리스트가 보입니다.

필요한것 받으시면 되는데 Google USB Driver는 꼬옥 설치하세요.

참고 : 구글 AdMob을 차후 계속 중이라면 Google Play services도 선택하세요.

지금 설치 안하더라도 나중에 추가하실 수 있으니 걱정 마세요.



설치가 이제야 완료 되었네요. 창을 닫습니다.



Step 3. 유니티 SDK 경로 세팅하기.(마무리단계)

유니티를 실행 시킵니다.

상단 메뉴에서 Edit -> Preferences 를 선택합니다.

External Tools에서 Android SDK Location을 설정해줍니다.


Step1에서 기본 경로로 설정하셨다면 저와 같을꺼에요. 



Step 4. 테스트 하기

상단 메뉴에서 File -> Build Settings 를 클릭합니다.

Android를 선택하고 Switch Platform을 눌러줍니다.


그리고 Player Settings를 눌러줍니다.

참고 : Bundle Identifier를 수정해주셔야 빌드가 되요.


Bundle Identifier를 수정해 줍니다.

참고 : 숫자는 안되요!


완료 되었습니다. 

폰 연결하고 빌드 해보시면 잘 되실꺼에요^^

안되시면 댓글 주세요.



+ Recent posts