Passenger - Let Her Go


오늘 같이 비오는 날 듣기 좋은 잔잔한 노래 Passenger의 Let Her Go를 포스팅 해보겠습니다.

사실 요즘 EDM, 힙합과 같은 음악이 대세를 이루고 있어 이러한 포크(?)류의 음악은

제 또래들(20대) 사이에서는 크게 인기가 없는 듯 합니다.



아일랜드 감성을 노래하는 Passenger는 2013년 이 Let Her Go라는 노래로 이름을 알리기 시작합니다.

그는 잔잔한 분위기와 함께 편지를 읽듯 편안하면서도 마음에 와닿는 가사를 노래합니다.


이 노래 역시나 많은 생각을 하게 하는 가사를 담고 있네요.

Passenger - Let her go 

 

Well you only need the light when it's burning low 

당신은 빛이 사라질 즈음에야 빛을 필요로 하고

Only miss the sun when it starts to snow 

눈이 내리기 시작할 즈음에야 햇살을 그리워하고

Only know you love her when you let her go 

그녀를 떠나보낼 때야 그녀를 사랑한다는 걸 알게 되죠
 

Only know you've been high when you're feeling low

우울할 때에야 행복했다는 걸 깨닫고 

Only hate the road when you're missing home

집이 그리워 질 때야 지나온 길을 싫어지고  

Only know you love her when you let her go

그녀를 보내야 할때야 그녀를 사랑한다는 걸 알게 되죠.

And you let her go 

그리고 당신은 그녀를 떠나보내죠

 
Staring at the bottom of your glass 

당신은 유리잔 밑을 바라보며

Hoping one day you'll make a dream last

언젠가 꿈이 이루어질 거라 바라고 있죠

But dreams come slow and they go so fast 

하지만 그 꿈은 천천히 다가오고 순식간에 사라져요

 

You see her when you close your eyes 

당신은 눈을 감을 때 그녀를 볼 수 있어요

Maybe one day you'll understand why 

어쩌면 언젠가 당신도 알게 될거예요 

Everything you touch surely dies 

왜 스쳐간 모든 것들이 그렇게 사라지는지

Staring at the ceiling in the dark

어둠속에서 천장을 바라보면서

Same old empty feeling in your heart

마음속에 오래 간직했던 공허함을 느껴요

'Cause love comes slow and it goes so fast 

왜냐면 사랑은 천천히 다가오고 순식간에 사라지기 때문이죠 

Well you see her when you fall asleep

당신은 잠이 들 즈음에야 그녀를 볼 수 있어요

But never to touch and never to keep 

하지만 만질 수도 없고, 잡을 수도 없죠

'Cause you loved her too much and you dive too deep 

왜냐면 당신은 그녀를 너무 사랑했고, 너무 깊게 빠져 들었으니까요


너무나 익숙해서 몰랐던 것을 잃고나서야 후회한다는 그런 내용입니다.

잔잔하면서도 많은 생각을 하게하는 노래. 오늘 같이 비오는 날 듣기에 좋을 것 같습니다.



1. Func 델리게이트


결과를 반환하는 메소드를 참조하기 위해 만들어졌습니다.

.NET 프레임워크에는 모두 17가지 버전의 Func 델리게이트가 있습니다.


ex)

public delegate TResult Func <out TResult>()

public delegate TResult Func <in T, out TResult> (T arg)

public delegate TResult Func <in T1, in T2, out TResult> (T1 arg1, T2 arg2)

....

public delegate TResult Func <in T1, in T2, ... in T16, out TResult> (T1 arg1, T2 arg2, .... , T16 arg16)


Func 델리게이트는 입력 매개 변수가 하나도 없는 것부터 16개까지 다양한 버전이 존재합니다.

매개 변수가 16개 이상인 경우, 혹은 ref, out한정자로 수식된 매개 변수를 사용해야 하는 경우가

아니라면 .NET에서 제공하는 기본 Func를 사용하면 되겠습니다.


ex)

using System;


namespace FuncTest{


class MainApp{


static void Main(string[] args){


Func<int> func1 = () => 10;

Console.WriteLne("func1 = {0}", func1());


Func<int,int> func2 = (x) => x*2;

Console.WriteLne("func2= {0}", func2(2));


Func<double, double, double> func3 = (x,y) => x*y;

Console.WriteLne("func3 = {0}", func3(2.0 , 3.0));


}

}

}


실행 결과


func1 = 10

func2 = 4;

func3 = 6.00000000000000



2. Action 델리게이트


Action 델리게이트는 Func 델리게이트과 거의 같으나, Action 델리게이트는 변환 형식이 없습니다.

Action 델리게이트도 Func 델리게이트와 마찬가지고 .NET 프레임워크에 17가지 버전이 선언되어 있습니다.


ex)

public delegate void Action <>()

public delegate void Action <in T> (T arg)

public delegate void Action <in T1, in T2> (T1 arg1, T2 arg2)

....

public delegate void Action <in T1, in T2, ... in T16> (T1 arg1, T2 arg2, .... , T16 arg16)


Func와는 달리 결과를 반환하지 않고 일련의 작업을 수행하는 것이 목적입니다.


ex)


using System;


namespace ActionTest{


class MainApp{


static void Main(){


Action ac1 = () => Console.WriteLine("Action()");

act1();


int result = 0;

Action<int> ac2 = (x) => result = x * x;


ac2(3);

Console.WriteLine("result = {0}", result);


Action<double, double> ac3 = (x,y) = > {


double pi = x/y;

Console.WriteLine("Action<T1, T2>({0}, {1}) = {2}", x,y,pi);

};


ac3(22.0, 7.0);

}

}

}


실행 결과


Action()

result = 9

Action<T1, T2>(22, 7) = 3.14285714285714





오늘은 유니티의 mesh에 대해서 알아보도록 하겠습니다.


mesh란 쉽게 말해 점, 폴리곤(삼각형), UV를 관리하는 구조체입니다.

컴퓨터 그래픽, 특히 게임 그래픽은 삼각형이 기본이 되는데

이 삼각형(폴리곤) 2개를 가지고 사각형을 만든 다음 텍스쳐를 입히는 방식입니다.


폴리곤에 대해서 좀 더 얘기해보자면 mesh의 한 단위를 가리키는 것으로

이것이 많이 사용될수록 3D모델의 디테일이 좋다진다 할 수 있습니다.


이렇듯 mesh는 게임 제작에서 사용되는 모든 모델의 기초구조라고 생각하시면 됩니다.


오늘은 mesh의 verices, triangles, uv를 가지고 mesh가 만들어지는 과정에 대해 얘기해볼까 합니다.


앞서 말씀드렸듯이 mesh란 것은 삼각형들이 모여 만들어진 것입니다.

위의 상자에 보이는 v0,v1,v2.. 가 vertex(꼭지점)가 되는 것이고, 그것들로 이어진 삼각형이

triangle polygon이 되는 것입니다. 그렇다면 꼭지점을 만들고 이어붙여 폴리곤을 만든다음 mesh로 만들면 되겠네요.



이차원 사각형을 나타내는 코드입니다. 먼저 Vector3로 꼭지점의 좌표를 배열로 만들어 줍니다.

그 다음 삼각형을 만들어 주어야 하는데, int형 배열을 사용해서 3개씩 이을 꼭지점(vertices)의 인덱스를 입력해주면 됩니다.

삼각형이기 때문에 꼭지점을 3개씩 맞춰줘야 합니다. 이번에는 텍스처를 한번 넣어보도록 하겠습니다.



여기서 UV라는 놈이 나오는데, 텍스처를 넣으려먼 이 UV좌표를 설정해주어야 합니다. UV의 좌표는 vertex와 동일 해야 합니다.

uv의 수치는 0~1까지이며 다음과 같습니다.


즉, vertex가 

2        1

3        4            이 순서로 찍혔기 때문에


uv 좌표 또한

2        1

3        4            이 순서로 찍어주어야 합니다.


그리고 나서 mesh.uv에 만든 uv 배열을 넣어주고 SetTexture라는 함수를 만들어 원하는 텍스처를 입혀주시면 됩니다~


참고 : http://www.devkorea.co.kr/reference/Documentation/ScriptReference/Mesh.html







DFS 알고리즘 문제 - 안전 영역(백준)


DFS혹은 BFS의 기본 원리를 알고 있다면 쉽게 풀릴만한 문제이다.

완벽하게 풀었다 생각했지만 4번의 실패..


문제는 비가 안올 경우도 존재한다는 것이다..

백준 사이트는 문제가 많아서 좋지만.. 이런 경우 조금 짜증이 나기도한다.

어떤 부분이 틀렸는지 정올 처럼만 가르켜줘도 쓸데없는 시간이 단출될텐데 말이다..

(물론 오답을 찾는 과정이 쓸데없는 시간은 아니지만 이러한 부분은 쪼금...)


예를들어 

1 1

1 1

이 입력되었다면 모두 물에 잠겨버리기 때문에 답은 0일 것이다.

하지만 비가 오지 않는다면 1개의 지역이 남기 때문에 답은 1이 된다는 것이다.. 하...


안전 영역 - DFS 알고리즘 문제


01. 변수 선언, 초기화


02. DFS 알고리즘


03. 메인


풀 때까지만해도 기분좋게 풀었는데.. 틀린 부분을 찾다가 기분이 그닥..

문제를 몇번이나 읽어보았는데 비가 안올 경우는 정말 생각하지도 못했다..

반성하자.



다이나믹 프로그래밍 (동적 계획법) 알고리즘 문제 - 다리 놓기 (백준)


점화식을 찾는 과정이 상당히 어려웠다.

N의 수를 차례로 늘려보기도 하고, M의 수를 차례로 늘려보기도 했으나

도저히 감이 잡히지 않아 굉장히 어려운 문제였다.


하지만 다리가 크로스 될 수 없다는 조건을 떠올려서 간신히 점화식을 구할 수 있었다.

N의 가장 위에 점이 M의 가장 위의 점에다 다리를 놓게 된다면


dp[N-1][M-1]의 경우의 수를 얻을 수 있다.

거기에다 M에 하나의 점이 추가되기 전인 dp[N][M-1]의 경우의 수를 더해주면 점화식을 완성할 수 있다.

(N과 M은 1부터 차례대로 올라가면서 모든 경우의 수를 찾아 dp에 저장하였다.)


dp[N][M] = dp[N-1][M-1] + dp[N][M-1]


설명이 상당히 미흡한 부분이 많은데, 이해가 가지 않는 다면

기존에 구해 놓은 답을 통해 현재의 답을 찾는다 라는 동적 계획법의 기본 원리를 떠올려보고

몇 가지의 케이스를 노트에다 적으면서 점화식을 찾아내는 것도 좋은 방법일 것이다.


동적 계획법 문제 - 다리 놓기 (백준)


항상 느끼는 것이지만 수행 시간이 다른 사람보다 많이 나오는 것 같다.

시간 단축을 위해 dp[0][M]을 초기화하는 과정을 빼고 싶었으나 GG..



다이나믹 프로그래밍은 정말 많이 풀어봐야겠다는 생각이 든다..


다이나믹 프로그래밍(동적 계획법) 문제 - 2xn 타일링(백준)


동적 계획법의 가장 기본적인 문제가 아닌가 한다.

2xn 크기의 타일이 주어진다면 2x1, 1x2크기로 타일을 채울 수 있는 경우의 수를 모두 구하는 문제이다.


1. 2x1 크기 타일로 채우는 방법

2. 2x2(1x2 타일 두개)로 채우는 방법


위의 두가지 방법으로 분류하여 생각하면 쉽게 점화식을 찾을 수 있다.


동적 계획법의 기본 원리를 짚고 넘어가자면 차근차근 답을 찾아나가면서

그 답을 dp배열에 저장하고, 저장된 데이터를 통해 다음 답을 찾아나간다는 것이다.


n크기의 타일을 채울 수 있는 경우의 수는 

1. dp[n-1]의 경우의 수에 2x1 크기 타일을 하나씩 붙여주는 경우

2.  dp[n-2]의 경우의 수에 2x2 크기 타일을 하나씩 붙여주는 경우


dp[x]의 값에는 n이 x일 경우의 모든 경우의 수가 들어가 있다. 


따라서 dp[10]의 값을 찾는다 하면 

dp[9]에 2x1타일을 하나 붙여주는 경우 + dp[8]에 2x2타일을 하나 붙여주는 경우이다.

해당 인덱스의 dp에는 모든 경우의 수가 들어있다는 보장이 있기 떄문에


dp[n] = dp[n-1] + dp[n-2] 라는 점화식이 성립하게 된다.


다이나믹 프로그래밍 - 2xn 타일링(백준)


소스 코드


코드는 굉장히 짧지만 점화식을 생각해내는 시간이 꽤 오래 걸렸다.



Aerosmith - I don't want to miss a thing


퀸 다음으로 좋아하는 락 그룹 에어로스미스

그들 노래 중에서도 가장 좋아하는 노래 I don't want to miss a thing.



아마겟돈의 OST로도 유명한데, 영화의 이펙트도 상당히 강했고

이 노래와 함께 나온 엔딩장면이 아직도 잊혀지지가 않는다.



벌써 노장이 되어버린 에어로스미스..

폭발적인 에너지가 넘치던 전성기때와는 달리 요즘은 힘에 부치는 느낌..ㅠ


하지만 요즘 라이브 중에 전성기 때의 가창력을 보여주는 영상을 찾게 되었다.

어쿠스틱 버전이라 보컬 스티븐 타일러의 매력적인 목소리를 더욱 잘 감상할 수 있다.



이 노래를 들을 때마다 아마겟돈의 엔딩씬이 항상 아른거린다.
노래는 듣는 부분도 중요하지만, 시각적인 요소로 와닿는 부분도 상당히 중요한 것 같다.




BFS 알고리즘 문제 - 나이트의 이동 (백준)


전형적인 BFS문제이다. 체스판 위의 나이트를 이동시켜

목적지까지 도착하는 문제. 최단 거리를 찾아야 하기 때문에

DFS 알고리즘 보다는 BFS 알고리즘이 효율적일 것이다.


체스판의 범위에 있는지를 체크할 때 부등호 하나를 빼먹어서 틀린 이유를 찾느라 상당히 애를 먹었다.

항상 느끼는 거지만 문제를 꼼꼼히 잘 읽어야 겠다 ㅠ


나이트의 이동 (BFS 알고리즘 문졔)


시간이 12MS가 뜨는 사람은 도대체 어떻게 풀길래 그 시간이 나올 수 있는거지..


01. 변수 선언


02. BFS


03. 메인


BFS와 DFS는 어느정도 자신감이 붙었고, 이제 DP를 중심적으로 해야할 것 같다.

그리디 알고리즘도 간간히 풀어봐야겠다는 생각이 든다.





2차원 배열의 합 - 동적 계획법 문제 (백준)


이 문제를 처음 보고 이게 왜 동적 계획법인가 의아했다.

그냥 아무 생각 없이 2중 for문을 돌려서 답을 찾았다.

너무 쉬운 문제라고 생각했다. 하지만 수행시간이 상당히 맘에 걸렸다.


다른 분들은 16MS가 나오는데 836MS가 떠버린 것..

수행 시간을 위해서라도 동적 계획법으로 풀어봐야겠다는 생각이들어서

나름 DP배열을 선언하고 활용하면서 문제를 다시 풀어보았다.


2차원 배열의 합(동적 계획법)


836MS에 비하면 반으로 줄었지만 16MS에 비하면 어마어마한 수치가 떠버렸다..

어떻게 풀었을지 힌트라도 얻고 싶은데.. 코드 오픈을 아무도 해놓지 않았다 ㅠ


01. 초기화

초기화를 할 때 DP배열 또한 초기화를 해주었는데

이전의 모든 값의 합을 저장하는 것이 아니라 한 행마다 따로따로 합을 계산했다.


02. 동적 계획법(다이나믹) 알고리즘

때문에 DP배열 x행의 y열을 선택하면 그 행의 y열까지의 최대 합이 들어있다.

그 합을 모두 더한 것에서 필요 없는 부분을 빼버리면 답을 구할 수 있다.


딱 보고 문제가 너무 쉬웠기 때문에 빨리 풀고 다음 문제로 넘어가야지 했는데

수행 시간 때문에 한참을 고전했던 것 같다. 완벽하게 수행 시간을 줄이지는 못했지만

계속해서 연구해봐야 할 가치가 있는 문제라고 생각한다.



DFS 알고리즘 - 영역 구하기 (백준)


확실히 DFS가 BFS 알고리즘 보다는 손이 덜 가고 쉽게 풀리는 것 같다.

이번 문제는 입력을 받을 때, 모눈 종이 역할을 하는 2차원 배열에 색칠을 해나가면서 진행했다.

좌표를 구하는 부분에서 수학 문제를 푸는 것 같아 약간 주춤했지만 어려운 수준이 아니라 패스~


영역 구하기 문제 (DFS 알고리즘)


01. 변수 선언


02. 초기화


03. DFS 알고리즘


04. 메인


최근들어 BFS, DFS 문제를 많이 풀어보고 있는데, 확실히 동적 계획법보다는 푸는 재미가 있는 것 같다.

현재 만들고 있는 퍼즐 게임에서 유용하게 쓰일 알고리즘이라 한 동안 집중해서 공부할 예정이다.






+ Recent posts