시애틀의 잠 못 이루는 밤 - 톰 행크스 , 맥 라이언


제가 가장 좋아하는 멜로물 중에 하나인 시애틀의 잠 못 이루는 밤(1994)를 소개 하겠습니다.

요즘 멜로영화같이 시간 이동을 한다던지, 연애의 복잡한 심리를 나타낸다던지,

20대의 선남선녀가 나와 눈이 즐거운(?) 그러한 멜로물은 절대 아니다.



그럼에도 이 영화를 시간만 나면 다시 돌려보는 이유는 요즘 영화에서 찾아볼 수 없는 잔잔함? 이랄까

그리고 장르를 불문하고 90년대 영화를 상당히 좋아하는데, 90년도만의 그 특유의 감성이 있는 것 같다.



이 영화의 첫 장면에 나오는 주인공인 톰 행크스와 라디오의 어떤 박사(?)와 늦은 밤

죽은 아내에 대해 얘기를 하는 장면이 나오는데, 그 때 톰 행크스의 나지막한 목소리와

그 얘길 들으며 눈물을 흘리는 맥라이언의 모습이 상당히 인상 깊었고, 그 부분만 돌려본게 수십번은 될 것이다.



요즘 뭐 레이첼 맥아담스, 엠마 왓슨 등 아름다운 여배우들이 많이 있지만

이 당시 맥 라이언과는 절대 못 비비지..(지극히 주관적)


영화를 볼 때 원인과 결과, 즉 인과관계를 상당히 따지는 편인데

이 영화를 볼 때는 그냥 이게 운명이구나.. 이렇게 생각했던 것 같다.


사실 오래된 영화를 보면 멜로물이 상당히 운명론적인게 많은데 이도 그 중 하나가 아닌가 한다.

요즘은 멜로물도 상당히 자극적인게 많은데 정말 순수하고 잔잔한 멜로물을 원한다면 정말 추천하는 영화이다.


매우 주관적인 별점 5.0/5.0


Queen - Save me


중학교를 다닐 당시 공연 영상부터 라이브 음원까지

구할 수 있는 건 싹 다 끌어모아 소장할 정도로 좋아했던 가수 Queen


그 당시 보아 그리고 세븐, 비 등등 젊은 가수도 좋아할 만한데

내 아이리버 엠피3는 전부 퀸 노래 밖에 없었던 것 같다.


퀸 하면 굉장히 유명한 노래가 많은데

오늘은 그러한 곡들이 아닌 조금 덜 알려진 노래를 소개해보고자 한다.



퀸의 기타리스트 브라이언 메이가 작곡하고

퀸의 앨범 중 가장 상업적으로 성공했다 평가되는

The Game (1980) 이라는 앨범의 10번 트랙의 곡이다.


밑의 영상은 1981 몬트리올 라이브 영상이다.

좀 더 좋아하는 영상이 있었는데 어떤 공연 때였는지 가물가물하다..

락 밴드이지만 이런 발라드 풍의 곡도 상당히 잘 소화해낸 밴드가 아닌가 한다.


내가 이 곡을 좋아하는 이유 중 하나는 가사때문이기도 한데

연인과 헤어지고 너무 힘들다..라는 흔하디 흔한 가사이지만

구해달라는 표현을 쓴 게 맘에 들었다. 단지 그 부분 하나가 맘에들어서..ㅎㅎ


아무튼 생각보다 잘 알려지지 않은 곡인거 같아 이번 포스팅에서 소개해보았다.

너무나도 팬이기 때문에 앞으로도 퀸의 노래가 종종 올라오지 않을까.. 하는 느낌이 든다 ㅎㅎ

동적 계획법 (다이나믹) 알고리즘 기초 문제 - 포도주 시식 (백준)


오랜만에 동적 계획법 문제를 풀어보았다.

오랜만이라 그런지 또 감을 잃은 느낌이 든다..

저번에 풀어보았던 계단 오르기 문제와 비슷한 문제지만,

계단 오르기는 무조건 밟는 것이었고, 이번 문제는 포도주를 마실지 마시지 않을지

선택하는 과정이 포함되어 있기 때문에 꽤 생각을 해봐야 했던 문제였다.


동적 계획법 (다이나믹) 알고리즘 문제 - 포도주 시식 (백준)


항상 강조하지만

1. DP배열을 통해 답을 차근 차근 저장해 나갈 것!

2. 기존에 저장된 데이터를 통해 현재의 답을 찾아 나갈 것!

이 두가지만 기억한다면 동적 계획법은 끝났다고 볼 수 있다. (점화식 세우는 것이 문제이긴 하지만..)



완벽하게 이해했다 생각한 동적 계획법이었지만

오랫동안 머리를 안쓰다보니 상당히 낮설게 느껴진다.

상당히 오랫동안 고민을 했던 것 같다. 꾸준히 머리를 써줘야겠다는 생각이 든다..



[노래 듣자] LANY - ILYSB


요즘 제대로 빠져있는 노래 LANY의 ILYSB

몽환적인 느낌의 사운드와 보컬의 목소리가 엄청 잘 어울리는 노래이다.

특히나 후렴구 가성은 남자가 들어도 섹시하다고 느껴진다.



첫 포스팅이라 어떤 말을 써야할 지 모르겠지만
산책하거나 혼자 집에서 조용히 들을만한 노래로 추천~!



존 윅


영화를 보는 시기, 자신의 심리 상태 등 여러가지 요인에 의해

같은 영화를 보더라도 다른 것을 느낄 때가 간혹 있다.

지금부터는 리뷰를 쓰면서 그 당시에는 이 영화를 보고 어떤 생각을 했는지

그리고 지금의 내 생각은 얼마나 바뀌어 있는지 알아보고자 리뷰를 기록하겠다.


첫 영화는 키아누 리브스의 오랜 공백을 깬 복귀작  '존 윅'이다.


위의 사진만 보면 무슨 드라마가 아닌가 생각할 수 있지만, 이 영화의 장르는 액션이다.

액션 중에서도 상남자의 액션이라 말할 수 있을 만큼 상당히 스타일리쉬하다.


액션만 보자면 별5개도 아깝지 않지만, 공감할 수 없을만한 스토리 전개가 있는 것 같아 호불호가 갈리는 것 같다.


첫 번째, 왜 죽이는가?

존 윅이라는 저명한 킬러가 왜 사람들을 무참히 죽이는가?에 대해 쉽게 공감할 수가 없었다.

이 부분은 어떻게 보면 이해할 것 같기도.. 어떻게 보면 너무 과한 처사가 아닌가.. 싶기도 하다.


두 번째, 왜 도와주는가?

존 윅이 위기에 처해있을 때마다 도와주는 옛 동료가 나오는데 (이름은 잘 기억나지 않는다.)

이 분이 왜 자꾸 주인공을 도와주는 것일까? 생각했고 그 이유가 곧 나오겠지.. 했지만 끝내 나오지 않았다.

어떻게 보면 그냥 넘어갈 수도 있는 부분이겠다 싶지만, 이 부분이 상당히 마음에 걸렸다.. (지극히 주관적)


처음 리뷰를 쓰다보니 두서도 없고 횡설수설 하는 것 같지만, 이 영화..

이유를 찾지 않는다면 히트맨 이후로 최고의 스타일리쉬 액션영화라고 생각한다.


존윅이 킬러로 복귀하는 장면과, 간지나는 대사들.. 한 마디로 남자의 스트레이트를 표현한 액션이라 할 수 있겠다.

액션 영화를 좋아하시는 분이라면 실망하지 않을 것이다.


매우 주관적인 점수 4.0/5.0


[자료구조] 우선순위 큐의 완성


힙을 사용하여 삽입, 삭제 등 우선순위 큐와 근접하게 완성해 보았다.

하지만 지금까지 구현한 우선순위 큐에는 한가지 문제점이 있는데

데이터와 함께 우선순위에 대한 정보를 사용자가 직접 지정해주어야 한다는 것에 있다.


주어진 데이터를 기반으로 우선순위가 정해지며 우선순위가 정해지는 기준을 사용자가 지정해주는 것이 좋은 자료 구조이다.

자 그럼 우선순위를 정하는 기준의 정보를 담은 함수를 정의하여 함수 포인터로 넘겨주는 식의 구현을 해보자.


1. 구조체 재정의


우선 기존의 힙 구조체를 지우고 함수 포인터를 멤버로 갖는 새로운 힙 구조체를 생성하자.

이 함수 포인터로 전달된 정보를 통해 우선순위를 정할 것이고, 정의 기준은 사용자의 필요에 따라 정한다.


위의 코드를 보면 함수 포인터의 선언과 멤버 선언이 각각 2개로 나누어져 있는데,

typedef로 함수 포인터를 선언하는 두 가지 방법이 있음을 보여주기 위한 것이다.


02. 초기화 함수


초기화 함수에 우선 순위를 정하는 기준에 대한 정보를 담은 함수를 적용시키고 있다.


02. 우선순위가 높은 트리 찾기 함수


원래는 사용자가 정해준 우선숭위에 대한 정보를 통해 처리되었다면

지금은 자용자가 정해준 함수를 통해 우선순위에 대한 처리가 이루어지고 있다.


03. 삽입


삽입 또한 사용자가 지정한 우선순위에 의해 처리되던 기존 방식과는 달리

사용자가 지정한 함수에 의해 우선순위가 가려지며, 새 노드의 위치가 결정되고 있다.

매개변수로 원래는 pr이라는 우선순위 정보가 전달되었지만 지금은 없어졌다.


04. 삭제


삭제 또한 삽입과 마찬가지로 진행된다.


05. 메인


초기화를 할 때 우선순위 기준 정보를 담은 함수를 적용시켜주고 있다.


지금까지 우선순위 큐의 이해와 구현과정에 대해 알아보았다.

다음 부터는 이진 탐색트리에 대해 공부해보도록 하겠다.






BFS 알고리즘 문제 : 미로 탐색 (백준)


약 2주전 이 문제를 DFS 알고리즘으로 풀어본 적이 있다.

하지만 시간초과가 떠서 상당히 난감한 적이 있었는데

이를 BFS 알고리즘으로 풀어보니 상당히 쉽게 풀렸다.


해가 없는 경로로도 쭉쭉 들어가서 수행시간을 폭발 시키는 DFS 알고리즘의 단점을 실감할 수 있었고,

DFS 알고리즘에 비해 BFS 알고리즘은 공간 복잡도는 상당하지만 항상 최단 경로를 보장한다는 장점을 체험할 수 있었다.


미로 탐색이라는 알고리즘은 DFS, BFS 알고리즘으로 풀어봄으로써

약간씩 헷갈렸던 두 알고리즘의 장단점을 명확하게 할 수 있었다.


미로 탐색 (백준)


1. 필요한 변수 선언


2. 초기화


3. 인큐, 디큐, 비었는지 확인, 가능한 경로인지 확인


4. BFS 알고리즘


5. 메인


6. 참고

DFS 알고리즘과 BFS 알고리즘의 장단점을 잘 정리해놓은 것 같아 링크를 가져왔다.

http://blog.naver.com/jjuncoder/220797012420



[자료구조] 우선순위 큐의 구현(3) - Delete , Insert


오늘은 우선순위 큐의 삽입, 삭제 과정에 대해 알아보도록 하겠다.

저번 시간에 두 자식 노드 중 우선순위가 높은 놈을 찾고, 자식이 없다면 0을 리턴하는 함수를 정의했다.

그 함수를 적극 활용하여 Delete 과정을 이해해 보도록 하자.

Delete 과정을 잘 이해한다면 Insert 과정 또한 쉽게 이해할 수 있을 것이다.


1. 우선순위 큐의 Delete 구현

2. 우선순위 큐 삭제의 과정

1. 가장 마지막 노드를 추출한다.

2. 인덱스 1번에 위치한 노드가 삭제되기 때문에 그 밑의 자식노드들과 마지막 노드의 우선순위를 비교한다.

3. 자식노드의 우선순위를 비교할 때, 저번 포스팅에서 정의한 GetHiPriChildIDX() 함수를 사용한다.

4. 현재의 노드가 마지막 노드보다 우선순위가 높다면 한칸 위로 이동한다. (1번이 빠졌기 때문에 공간을 메운다.)

5. 마지막 노드보다 우선순위가 낮거나, 자식노드가 더이상 없을 때, 마지막 노드의 자리가 결정된다.


3. 그림으로 이해(..?)


우선순위 큐의 Delete 구현 소스 우측에 적혀있는 번호와 위 그림의 번호의 동작과 일치한다. (그림이 쪼금 애매하다.)


쉽게 말해서, 힙의 마지막 데이터를 빼서, 가장 위쪽에서부터 차례로 비교를 해오면서 내려온다.

그리고 마지막 노드보다 우선순위가 높다면 한칸씩 위로 이동하게 해주는 것이다.


4. 우선순위 큐의 Insert 구현

5. 우선순위 큐의 삽입 과정

1. 힙의 마지막 자리에 새로운 노드를 배정 (실제로 넣지는 않고 가정만 한다.)

2. 그의 부모노드와 우선순위를 비교하여 위치 변경

3. 삭제의 과정이 위에서 밑으로 였다면, 삽입의 과정은 밑에서 위로

오늘은 우선순위 큐의 Delete와 Insert 과정에 대해 알아보았다.

다음 포스팅에서는 좀 더 유연성있게 우선순위를 정하는 힙에 대해 알아보도록 하겠다.



동적 계획법 (다이나믹) 알고리즘 문제 : 1로 만들기 (백준)


동적 계획법에도 어느정도 익숙해져 가는 것 같다.

매번 강조하는 내용이지만 그 전에 찾아 놓은 답을 활용할 것!

그리고 그 전에 찾아 놓은 답을 저장할 DP배열을 꼭 만들 것!

이 둘만 기억한다면 동적 계획법 알고리즘은 쉽게 풀 수 있을 것이다.


늘 그렇듯 이번 문제에도 함정이 있었는데.. 나만 그렇게 생각하는 것일 수 있지만

2로 나누어 떨어지는 숫자라도 -1을 해준 뒤 계산할 경우 더 작은 숫자가 나올 수 있다는 것이다.

(3으로 나누어 떨어지는 숫자는 무조건 가장 작은 수이기 때문에 -1한 값과 비교할 필요가 없다.)


10을 예로 들어보자.

2로 나눈다면 5가될 것이고 DP[5]에는 3이 저장되어 있을 것이다.

따라서 총 연산 횟수는 4번.


하지만 -1을 해주고 시작한다면 9가되고 DP[9]에는 2가 저장되어 있을 것이다.

따라서 총 연산 횟수는 3번.


이 부분을 생각하는 데 시간이 좀 걸렸으나, 전체적으로 쉬운 동적 계획법(다이나믹) 문제이다.



01. 변수 선언 그리고 초기화


02. 동적 계획법(다이나믹) 알고리즘을 수행할 함수

03. 메인 함수


동적 계획법(다이나믹) 알고리즘의 기본 문제를 풀어 보았다.

요즘 동적 계획법 문제만 풀어보는 것 같은데 다음 포스팅에서는 DFS, BFS문제를 풀어보도록 하겠다.


[자료구조] 우선순위 큐의 구현(2) - Helper Function


--> 초기화와 힙이 비었는지 확인하는 함수

--> 그리고 특정 노드의 인덱스를 전달하면, 부모 노드, 왼쪽 자식, 오른쪽 자식의 인덱스 값을 반환하는 함수

특정 노드의 부모, 왼쪽 자식, 오른쪽 자식 노드의 인덱스 값을 반환하는 함수의 구현이 이해가 되지 않는다면

우선순위 큐의 이해(3)으로 가서 인덱스 값을 구하는 간단한 공식을 이해해야 한다.



우선 순위가 높은 자식의 인덱스 값을 반환하는 함수

설명에 들어가기 앞서 힙은 완전 이진 트리라는 것을 다시 한번 숙지하자!

(1) 완전 이진 트리에서 왼쪽 자식 하나만 있는 트리는 0개 혹은 1개 뿐이다!

(2) 왼쪽 자식이 하나만 존재하는 트리가 있다면 그 왼쪽 자식 노드는 마지막 노드이다!


1. 자식 노드가 없는 경우

--> 왼쪽 자식 노드가 들어 갈( 혹은 들어간 ) 자리의 인덱스 값이 저장된 데이터의 개수보다 클 경우

--> 자식 노드가 존재하는 경우라면 총 데이터의 개수보다 클 수가 없다. (자식 노드 또한 데이터의 개수에 카운트 되었기 때문)


2. 자식 노드가 하나 있는 경우

--> 자식 노드가 하나 있는 경우는 완전 이진 트리에서 단 하나의 노드밖에 있을 수 없다.

--> 완전 이진 트리는 왼쪽부터 차곡차곡 저장되어 나가기 때문에 당연한 결과이다. (이해가 안된다면 그림을 그려보자.)

--> 또한 왼쪽 자식노드 하나만 존재하는 경우라면 그 노드는 힙에 저장된 마지막 노드이다.

--> 따라서 왼쪽 자식 노드의 인덱스와 저장된 데이터의 총 개수가 같다면 이는 자식 노드가 하나만 있는 경우이다.


3. 둘 다 존재하는 경우

--> 두 노드의 우선순위를 비교해서 우선순위가 높은 놈을 리턴한다.


--> 위에서 설명한 우선순위가 높은 노드를 리턴하는 방식은

매우 대표적인 연산문이기 때문에 잘 이해를 해 놓아야 한다!


오늘은 우선순위 큐를 구현하기 위한 Helper Function에 대해 알아보았다.

다음 포스팅부터는 삽입, 삭제에 대한 구현에 대해 다뤄보도록 하겠다.


+ Recent posts