https://www.acmicpc.net/problem/15828

 

15828번: Router

인터넷을 사용하기 위해서는 컴퓨터에 인터넷 회선을 연결하거나 Wi-Fi를 연결해야 한다. 이렇게 연결된 네트워크를 통해 컴퓨터에는 통신이 가능하다. 마음에 드는 노래나 동영상이 있는 곳에

www.acmicpc.net

 

#include <cstdio>
#include <queue>

using namespace std;

// 라우터

int main()
{
	queue<int> q;

	int n;
	scanf("%d", &n);

	int packet = 0;
	int packet_size = 0;

	while (packet != -1)
	{
		scanf("%d", &packet);

		if (packet == 0)
		{
			q.pop();
			packet_size = q.size();
		}
		else if (packet == -1)
		{
			break;
		}
		else
		{
			if (q.size() < n)
			{
				q.push(packet);
				packet_size += 1;
			}
		}
	}

	if (packet_size == 0)
	{
		printf("empty");
		return;
	}

	for (int i = 0; i < packet_size; ++i)
	{
		printf("%d\n", q.front());
		q.pop();
	}
}

 

 

..원래 C++로 풀었는데 똑같은 코드임에도 C++로 제출할 때는 시간초과가 뜨는데 C로 제출하니 100점이라고 떴다.

이전에 개행이나 print같은 부분에서 C가 훨씬 빨라서 C++과 제출 시간의 차이가 있었는데 얘도 마찬가지여서 그랬나. 

테스트 케이스가 너무 궁금하다. 

 

 

 

스택 C언어로 구현하기 (배열)

Stack 

 

 

 

먼저 들어온 데이터가 나중에 나가는 구조를 가지고 있는 스택은 배열과 연결리스트로 구현할 수 있다.

그 중 배열을 이용한 구현 방법은 다음과 같다. 

 

 

◎ 배열

배열을 스택으로 구현하기 위해 기억해야 할 것은 두 가지이다.

처음 인덱스 0의 배열 요소를 스택의 바닥(Bottom)으로 정의하고 마지막에 저장된 데이터의 위치를 기억해야 한다.

 

인덱스 0의 요소를 스택의 Bottom으로 정의하면 배열의 길이와 관계없이 항상 인덱스 0의 요소가 스택의 Bottom이 되며 마지막에 저장된 데이터의 위치는 Top이 되기 때문이다. 

 

 

◎ 삽입(Push)과 삭제(Pop)

삽입, 즉 Push는 Top Index를 위로 한 칸 올리고 Top이 가리키는 배열의 위치에 해당 데이터를 저장한다.

삭제 Pop은 Top Index의 데이터를 반환하고 Top Index를 한 칸 줄인다. 

 

void push(int num)
{
	stack[++index] = num;
}

int pop()
{
	return stack[index--];
}

 

 

 

 

 

참고 자료;

윤성우의 열혈 자료 구조 (출판사; 오렌지 미디어, 저: 윤성우)

 

 

애니메이션 1

애니메이터 컨트롤러

 

 

 

유니티의 애니메이션 시스템은 메카님(Mecanim)이라고 한다.

메카님을 구성하는 요소들은? 애니메이터, 아바타, 애니메이션 클립, 애니메이터 컨트롤러 등이 있다.

이 메카님을 이용하는데 가장 먼저 필요한 것이 바로 Animator Component이다. 

 

 

애니메이터 컨트롤러 만드는 법

 

 

 

◎ 애니메이터 컨트롤러 

 

화살표가 트랜지션, 네모 박스가 스테이트이다.

애니메이터 컨트롤러는 'state machine(스테이트 머신)'과 거기에 연결된 'animation clip(애니메이션 클립)'을 갖는 애셋이다.

 

컴포넌트가 아닌 애셋이므로 게임 오브젝트에 직접 적용할 수가 없다.

애니메이터의 프로퍼티에 있는 애니메이터 컨트롤러로 링크를 설정해서 사용한다. 

 

스테이트 머신은 동작 표현 방법의 하나이다.

유한 상태 머신이라 불리는 모델을 바탕으로 기호를 사용해서 동작 표현이 가능한 것이 큰 특징이다.

애니메이터 창에서는 스테이트를 표현하고 스테이트를 잇는 화살표 기호로 스테이트 간의 트랜지션을 표현한다. 

 

 

 

◎ 애니메이터 컴포넌트

애니메이션 기능을 추가하고 싶은 오브젝트의 inspector창에서 Add Component를 하면 Animator Component를 추가할 수 있다.

 

컴포넌트를 추가 후 생성해 놓은 애니메이터를 끌어다 놓으면 된다.

 

1. Controller

애니메이터 컨트롤러로 매카님의 핵심인 스테이트 머신과 애니메이션 클립을 가진다.

 

2. Avatar (아바타)

3D툴(ex, 3dMax, Blender)이 출력한 모델 파일을 유니티에서 다룰 수 있게 연결된 테이터

 

3. Update Mode

애니메이션의 계산을 언제 시행할지 결정하는 것이 Update Mode이다.

update mode에는 세 가지 종류가 있다.

 

 

첫 번째로 Normal

애니메이터 계산의 갱신이 스크립트의 Update 메서드와 같은 횟수로 호출돼 타임 스케일의 영향을 받는다
애니메이션과 Update 메서드의 계산을 완전히 동기화시킬 수 있다. (Update 메서드에서 Time 클래스의 값을 사용하는 것이 조건이다)

 

두 번째로는 Animate Physics

업데이트가 Fixed Update 메서드와 같은 횟수로 호출된다.
유니티가 다루는 물리 계산과 애니메이션을 동기화시킬 수 있다

 

마지막은 Unscaled Time

갱신은 Update 메서드와 같은 횟수인데, 타임 스케일의 영향을 받지 않는다. 메뉴 화면처럼 게임이 슬로우 모션 중일 때에도 정상적으로 애니메이션 시키고자 할 때 도움이 된다. 

 

 

4. Cull Mode

애니메이션 계산의 컬링 모드 설정이다. 컬링 판정운 카메라 밖에 있을 때의 프러스텀 (카메라) 컬링. 쉴드에 가려져 있을 때의 오클루젼 컬링 등이 있다. 대량으로 애니메이션 하는 오브젝트가 존재하는 경우 등에 불필요한 계산을 생략해 절약할 수 있다. 

이 컬모드에도 세 가지 종류가 있다.

 

 

첫 번째로는 Always Animate

컬링을 하지 않고 항상 애니메이션 계산을 한다.

 

두 번째로는 Cull Update Transforms

컬링 대상이 있을 때 애니메이션 계산의 일부 (리타깃, IK, Transform으로의 반영 등)을 생략한다.

 

세 번째로는 Cull Completely

컬링 대상일 때 모든 애니메이션 계산을 생략한다. 

 

 

 

◎ 루트모션

애니메이터 컴포넌트를 적용한 게임 오브젝트 자체는 Animator에서 보면 루트가 된다.

루트 위치에 대한 애니메이션은 게임의 설계에 따라 애니메이션으로 동작하고 싶은 경우도 있고 스크립트나 물리 계산 등으로 동작하고자 할 때도 있다.

 

유니티에서는 애니메이션 클립에 루트 위치의 이동을 포함했을 때도 애니메이터 컴포넌트의 루트 모션 (Apply Root Motion) 활성화 (on/off)를 설정해서 루트 위치의 이동을 반영하지 않게 설정할 수 있다.

 

이 설정이 있으면 루트 모션의 유무에 따라 애니메이션 클립을 각각 만들 필요가 없으므로 애니메이션의 재이용성이 높아진다

 

 

 

 

 

 

 

참고 자료;

유니티 게임 프로그래밍 바이블 (김은철, 유세라 옮김 ; 위키북스) 

 

 

현재 브랜치에서 다른 브랜치의 특정 commit을 내 브랜치에 merge하고 싶을 때는 체리픽을 이용한다. 

 

git cherry-pick (가져오고 싶은 커밋 넘버)

 

bash 혹은 소스트리에서 터미널을 열어 해당 명령어를 입력해주면 된다. 

 

2742번: 기찍 N (acmicpc.net)

 

2742번: 기찍 N

자연수 N이 주어졌을 때, N부터 1까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오.

www.acmicpc.net

 

..이 문제를 잊지 않기 위해서 포스팅하기로 했다.

 

#include <iostream>
using namespace std;
int N;
int main()
{
	cin >> N;
	for (int i = 0; i < N; ++i)
	{
		//cout << N - i << '\n';
		printf("%d\n", N - i);
	}
}

 

슥 채우고 넘어가려고 했는데 실패가 떠서 요근래 가장 당황스러웠다. 

100,000를 출력할 때 확실히 시간이 오래걸리긴 했다.

 

왜 자꾸 시간초과가 날까 검색해보다가 

cout, cin, endl가 printf나 '\n'보다 연산이 오래걸려서 그렇다고 했다.

그래서 그 출력 한줄 바꿔줬더니 4초만에 완료됐다.

나는 습관적으로 cin, cout을 사용하니까 다음에 시간초과 나거나 할 때 출력부분을 의심해 볼 만도 한 것 같다.

그리고 뭔가 입력과 출력에 대한 부분을 다시 깊게 찾아보는 것도 좋은 방법인 것 같다. 

 

11047번: 동전 0 (acmicpc.net)

 

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

 

#include <iostream>
#include <vector>
using namespace std;

int N, K;
vector<int> value;
int func()
{
	int answer = 0;
	int i = N-1;
	do {
		answer += (K / value[i]);
		K %= value[i];
		--i;
	} while (i >= 0);

	return answer;
}

int main()
{
	cin >> N >> K;
	int temp = 0;
	for (int i = 0; i < N; ++i)
	{
		cin >> temp;
		value.push_back(temp);
	}
	cout << func();
}

 

Greedy 알고리즘 문제로 간단하게 풀 수 있는 문제이다.

완전탐색을 진행하더라도 N번. 즉 10번만 돌면 되기 때문에 시간복잡도가 O(N)이다.

 

더보기

요즘 자꾸 주어진 케이스가 1개일 때 예외처리를 자꾸 빼먹는다. 문제 풀기 전에는 분명 꼭 1개일 때도 고려해야된다고 세번씩 다짐하지만 어느순간 잊는다.그래서 맨 위에 앞으로 주석으로 // N = 1개 일 때? 라고 추가하기로 했다.절대 안 볼 수 없게 특수문자 왕창 넣어 놔야지

 

1302번: 베스트셀러 (acmicpc.net)

 

1302번: 베스트셀러

첫째 줄에 오늘 하루 동안 팔린 책의 개수 N이 주어진다. 이 값은 1,000보다 작거나 같은 자연수이다. 둘째부터 N개의 줄에 책의 제목이 입력으로 들어온다. 책의 제목의 길이는 50보다 작거나 같고

www.acmicpc.net

 

map을 이용해서 입력받은 책의 이름들을 key값으로 넣어주었다. 

이렇게 하면 문제는 출력할 때 동일 우선순위(=value가 같을 때)에서 알파벳 순서대로 출력할 때 발생하게 된다.

그래서 map의 value값과 key값을 따로 정렬해주었다.

 

#include <iostream>
#include <map>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

int N;
map<string, int> m;

bool cmp(const pair<string, int> &a, const pair<string, int> &b)
{
	if (a.second == b.second)
	{
		return a.first < b.first;
	} 
	return a.second > b.second;
}


int main()
{
	cin >> N;

	string temp;
	for (int i = 0; i < N; ++i)
	{
		cin >> temp;
		m[temp] += 1;
	}

	vector<pair<string, int>> vec(m.begin(), m.end());
	sort(vec.begin(), vec.end(), cmp);

	cout << vec[0].first;
}

1475번: 방 번호 (acmicpc.net)

 

1475번: 방 번호

첫째 줄에 다솜이의 방 번호 N이 주어진다. N은 1,000,000보다 작거나 같은 자연수 또는 0이다.

www.acmicpc.net

 

6과 9를 바꿔서 사용할 수 있으므로 0~8까지만 체크하고 그거에 대한 예외처리들만 해줬다.

 

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

int roomNumber;

int func()
{
	int temp = 0;
	vector<int> number;
	number.resize(9); // 0~8까지 체크

	do
	{
		temp = roomNumber % 10;
		if (temp == 9)
			number[6] += 1;
		else
			number[temp] += 1;
		roomNumber /= 10;
	} while (roomNumber >= 1);
	

	number[6] % 2 ? number[6]++ : 0;
	number[6] /= 2;

	sort(number.begin(), number.end(), greater<int>());

	return number[0];
}


int main()
{
	cin >> roomNumber;
	cout << func();
}

 

 

쉬워보이기도 했고 금방 풀어서 제출했는데 안되길래 0일 때도 해보고 이것저것 해봤는데

while문 조건에 number >= 1 를 해줘야 되는데 그냥 >만 해줘서 1199를 했을 때 두 세트가 아닌 한 세트가 출력되고 있었다. 

간만에 풀어서 그런가 또 초심을 잃었다.. 

+ Recent posts