BFS 알고리즘 - 효율적인 해킹 문제 (백준)


하.... 런타임 에러 찾느라고 밤을 꼬박 샌 문제..

결국에 찾긴 했는데 정말 사소한 문제라 더더 기억에 남을만한 문제이다.


런타임 에러 문제를 해결하고 나니 시간초과.. 정답률도 상당히 낮은 나름 어려운 문제였지만

BFS 문제를 상당히 오랜만에 풀어본 것도 나름 원인중 하나였던 것 같다.


효율적인 해킹 , 시간 초과


01. 변수 선언, 초기화



02. bfs 알고리즘



03. 메인 함수


런타임 에러가 난 이유는 내가 큐를 읽고 쓰는 데에 wp, rp라는 변수를 통해서 접근을 했다.

큐를 한번 쓰고 다시 쓰기전에 이 변수들을 초기화해줘야 하는데 이 부분을 잊어 버렸다..

때문에 이 변수들이 큐의 범위를 넘어서 버린 것... 하.... 이것 때문에 몇시간을 고민했는지..


암튼 이 문제를 풀기위해 생각한 방법은

먼저 모든 컴퓨터 목록을 배열에다가 저장하고,

1번 컴퓨터부터 차례로 큐에 넣은 다음 연관있는 모든 컴퓨터들을 큐에다 넣고 조사하는 방식을 선택했다.

이렇게 문제를 풀면서도 상당히 비효율적이라 생각이 들어서 동적 계획법을 살쩍 섞어 볼까도 생각했었다..


하지만 조합하는 도중에 포기하고 원래 방식대로 모든 목록을 순회하는 방식을 사용..

역시나 시간초과.. 다른 이들은 어떻게 풀었나 궁궁해서 슬며시 찾아보니.. 


벡터를 사용한 기가막힌 방법이 있어서 그 방식을 연구해보았다.

다음 포스팅에서 벡터로 이 문제를 멋지게 해결한 방법을 알아보겠다.


DFS 알고리즘 - 순열 사이클(백준)


딱 봐도 DFS 알고리즘으로 풀면 쉽겠다.. 했는데

요즘 BFS알고리즘을 너무 안했다 싶어서 BFS로 도전했다가

2시간 고전끝에 풀지못하고 결국엔 DFS로..


문제를 다 파악하고 난 뒤라 그런지 10분 컷



01. 변수 선언


02.  DFS 알고리즘


03. 메인


DFS는 내가 생각하는대로 함수를 구성하면 짧고 쉽게 풀리는 반면

BFS는 큐도 만들어야 하고.. 코드도 상대적으로 길고.. 위와 같이 깊이를 우선적으로 탐색해야하는

문제에서는 적용하기가 힘든것 같다. 아직 BFS문제를 많이 안풀어본 것 또한 문제 중 하나


that thing you do (댓 씽 유 두)



오늘 소개할 영화는 우리가 너무 잘 알고 있는 톰 행크스가 나오는 댓 씽 유 두

한 줄로 소개를 하자면 시골의 촌뜨기 밴드가 유명한 밴드로 성장해 나가면서 겪는 갈등을 그린 영화?

사실 이 한 줄만 읽는다면 진부하고 뻔한 그런 성공스토리를 그린 영화구나.. 할 수 있지만 뭔가 특별한 것이있다.


사실 이 영화에서 톰 행크스의 비중은 그리 압도적이지 않다. 영화를 보고나서 가장 기억에 남는 사람은

드러머 역할을 했던 톰 에버렛 스콧!!(이 영화를 통해 첨 알게된 배우) 사실 이 영화의 가장 비중있는 주인공이라 할 수 있다.



다소 촐싹거리는 이미지를 가지고 있지만, 영화에서 상당히 매력적으로 나온다..

남자가 봐도 정말 멋있다고 할 정도.. ㅋㅋ



밴드의 보컬을 맡은 조나슨 스케치라는 배우.. 사실 영화에서도 그리 매력적으로 나오는 것도 아니고

유명한 배우도 아닌 것 같지만.. 이 영화의 주제곡 that thing you do를 부르는 보컬로 나오는데

사실 이 배우가 실제로 부른건지는 잘 모르겠지만.. 이 사람이 부른다 생각하고 봤더니 상당히 매력적이더라


그도 그럴것이 이 영화의 가장 특별한 점이라면 이 영화의 OST이기 때문이다.

극단적으로 표현하면 이 영화는 that thing you do라는 노래로 시작하고 이 노래로 끝이 난다.


무슨 대단한 노래길래 이러나 싶겠지만.. 막상 들어본다면 제목은 모르지만 아! 이노래! 하면서 나도 모르게 흥얼거리고 있을 것이다.

노래가 영화 도중에 상당히 많이 나오는데 나올 때마다 사람을 설레게하는 매력을 가진 곡이다.


영화를 보면서 끝으로 갈수록 '뭐 이런 개막장이 있어'라고 생각한 부분도 있는데

가장 마지막 부분을 본다면 나도 모르게 수긍하게된 그런 영화이다.


아무튼 이 영화 풋풋한 청춘 영화의 색을 띄고 있고, 설레는 OST까지 있으니 한번 쯤 꼭 보길 바란다.


매우 주관적인 별점 3.5/5.0





Maxwell - this woman's work



상당히 좋아하는 가수 중 한명인 맥스웰

네오소울이라는 다소 호불호가 갈리는 장르를 대표하는 아티스트 중 한명

우리 나라에서는 가수 정엽과 상당히 스타일이 비슷하다고 보면 된다.


그의 노래 중 this woman's work라는 곡을 소개할텐데

이 노래는 정말 옛날 가수이자 영국의 싱어송 라이터 케이트 부시의 곡을 리메이크 한 것이다.


어느 순간부터 가성을 쓰는 남자 가수가 상당히 섹시하다고 느껴졌는데

맥스웰의 노래를 듣고부터 그런 생각이 든 것 같다.



상당히 오래된 라이브 영상인데, 사실 요즘의 맥스웰의 라이브를 들으면 예전만 못하다는 생각이 든다..
목이 너무 상한 느낌이랄까.. 개인적으로는 저 아프로 머리..? 레게머리..?를 한 시절이 정말 전성기였다고 생각한다.

이 노래를 좋아하는 또 하나의 이유는 바로 가사

죽어가는 여자가 남겨질 자신의 아이와 남편에게 남기는 마지막 말과
자신에게 보내는 메세지를 담은 아주 슬픈 내용의 가사이다.
케이트 부시가 부른 원곡과 맥스웰의 리메이크 버전은 상당히 느낌이 다르지만
어떤 버전이든 노래가 상당히 애절하게 들린다.. 아마 가사 때문이겠지..

가사를 잘 올리는 편은 아니지만 이번 포스팅에는 가사를 모두 올려보도록 하겠다.

This woman's work


Pray God you can cope

당신이 이겨낼 수 있기를 신께 기도해요


I stand outside
난 그저 겉을 맴돌며 바깥에 서있을 뿐이죠


This woman's work

이건 여자의 일이고


This woman's world
여자의 세계에요


Ooooh it's hard on the man

오. 이건 남자에게 어려운 일이죠


Now his part is over
이제 나의 역할은 끝나고


Now starts the craft of the Father

신의 손길이 닿을 차례인거에요

I know you've got a little life in you yet

나는 너무도 힘겨울 당신의 삶을 알아요


I know you've got a lot of strength left
하지만 당신에게 이겨낼 힘이 있다는 것도 알아요


I know you've got a little life in you yet
나는 너무도 힘겨울 당신의 삶을 알아요


I know you've got a lot of strength left
하지만 당신에게 이겨낼 힘이 있다는 것도 알아요


I should be crying but I just can't let it show

난 울어야 하겠지만 그 모습을 보여주기는 싫어요


I should be hoping but I can't stop thinking

다시 함께 하길 바라야겠지만, 생각을 멈출 수가 없어요


All the things we should've said that I never said

함께 해야만 했지만 내가 하지 않았던 말들과


All the things we should have done that we never did

함께 해야만 했지만 내가 하지 않았던 일들


All the things we should have given but I didn't
내가 당신에게 주어야 했지만 줄 수 없었던 것들


Oh darling make it go

그대여. 이제 나를 떠나요


Make it go away

그냥 나를 떠나가요

Give me these moments

그 모든 순간들을 돌려줄 수 없나요.


Give them back to me

나에게 돌려줄 수 없나요


Give me that little kiss

한번 더 키스해줄 수 없나요


Give me your ...

당신의 ..


I know you have a little life in you yet
나는 너무나도 힘겨울 당신의 삶을 알아요


Give me your hand baby
그래도 나에게 손을 내밀어줘요


I know you have a lot of strength left

하지만 당신께 이겨낼 힘이 있다는 것도 알아요


Give me your prayers

날 위해 기도해줘요


I know you have a little life in you yet

나는 너무나도 힘겨울 당신의 삶을 알아요


Ooooh oooh oooh

I know you have a lot of strength left

하지만 당신에게 이겨낼 힘이 있다는 것도 알아요


Your loved child

사랑스러운 그대


I know you have a little life in you yet

나는 너무나도 힘겨울 당신의 삶을 알아요


Whatever you need baby

당신에게 필요한 그 무엇이라도


I should be crying but I just can't let it show

나는 울어야겠지만 그런 모습 보여주기 싫어요


I should be hoping but I can't stop thinking

다시 함께 하길 바라고 있어야겠지만, 끊임없이 떠오르는 생각들이


All the things we should've said that we never said

함께 해야 했지만 우리가 하지 않았던 말들과


All the things we should have done that we never did
함께 해야만 했지만 우리가 하지 않았던 일들


All the things that you wanted from me

당신이 나에게 바랬던 모든 것들


All the things that you needed tell me
당신이 나에게 하길 원했던 모든 말들


All the things I should have given but I didn't
내가 줘야만 했지만 주지 않았던 모든 것들


Oh darling make it go away
오 그대여. 이제 나를 떠나가요


Just make it go away now

이제 나를 떠나가요




DFS 알고리즘 문제 - 바이러스 (백준)

오랜만에 DFS 알고리즘 문제를 풀어보았다.

이 문제는 BFS 알고리즘으로도 가능하지만, 내 기준에는 DFS가 더 쉽기 때문에 DFS로 풀어보았다.


이 문제는 1시간이 걸렸는데.. 다 풀어놓고 왜 안되지 한참 고민하다가 보니까

연결된 컴퓨터 목록을 나타내는 배열인 net를 net[101][2]로 해놓았더라..

하나의 컴퓨터가 여러개의 컴퓨터와 연결이 될 수 있기 때문에 101 * 101이 되어야 하는게 맞다..

덜렁대다가 틀린거나 마찬가지.. 좀 더 문제를 신중하게 파악해야겠다..


DFS 알고리즘 - 바이러스 (백준)


01. 선언 및 초기화


02. DFS 알고리즘


03. 메인


이 문제는 조금 어려운게 있었는데, 컴퓨터가 체인처럼 이어져있다 보니

초기에 감염된 컴퓨터 뿐만아니라 그 컴퓨터를 통해 감염된 컴퓨터를 확인했다면

모든 연결망을 다시 확인해야 한다는 것.

물론 이 방법이 최선의 방법은 아닐 것이다. 더욱 좋은 알고리즘이 존재하겠지만

내가 생각한 풀이방법으로는 이 방법이 최선이었다..


아무튼 DFS, BFS 알고리즘은 왠만해선 다 풀 수있다고 자신했었는데

이 것도 안하다보니 감이 점점 떨어지는 것 같다.. 열심히 하자!





[자료구조] 이진 탐색 트리의 이해(1)


이진 탐색 트리는 말 그대로 탐색에 특화된 이진 트리이다.

앞서 이진 트리를 공부했기 때문에 이해와 구현이 어렵진 않겠지만,

기본적인 기능인 삽입, 삭제, 참조 중 삭제의 구현이 까다롭다.

왜 까다로운지, 어떻게 구현하는지는 차차 알아가 보도록하겠다.


이진 탐색 트리는 이진 트리의 확장 버전이라고 생각하면 된다.

이진 탐색 트리 = 이진 트리 + 데이터의 저장 규칙    ( 저장 규칙은 곧 탐색 규칙이라 말할 수 있다. )



위의 트리는 이진 탐색 트리를 나타낸 것이다.

루트 노드보다 작은 쪽은 왼쪽으로, 루트 노드보다 큰 쪽은 오른쪽으로라는 단순한 저장 규칙이다.

자세히 보면 꼭 루트노드가 아니더라도 어떠한 노드를 찍었을 때 왼쪽은 현재 노드보다 값이 작고 오른쪽은 크다.


정리하자면

1. 이진 탐색 트리의 저장된 키는 유일하다.

2. 루트 노드의 키 > 왼쪽 서브 트리의 루트 노드의 키

3. 루트 노드의 키 < 오른쪽 서브 트리의 루트 노드의 키

4. 왼쪽과 오른쪽 서브트리 또한 이진 탐색 트리이다.


지금까지의 내용은 이진 트리에서 간단한 규칙하나만 적용되었을 뿐이다.

하지만 이 간단한 규칙에 의해 탐색에 엄청난 효율을 가져올 수 있는데, 그 구현은 다음 포스팅에서 다루도록 하겠다.

[자료구조] 보간 탐색의 이해(1)

탐색이라 하면 원하는 데이터를 찾는 것이라 쉽게 알 수 있다.

하지만 효율적으로 데이터를 찾아내기 위해서 탐색의 방법을 개선할 수 있지만

이 방법에는 한계가 있고 탐색에 유용하도록 데이터를 저장하는 방식으로 개선할 수 있다.


즉, 어떻게 탐색할 것인가가 아니라, 탐색에 용이한 데이터의 저장방식이 무엇인가를 생각해야 한다.


이번 포스팅은 데이터의 저장방식에 대해서는 생각하지 않으나, 이번 탐색을 다루면서

이 부분이 상당히 중요한 부분을 차지 하기 때문에 들어가기에 앞서 이 주제로 포문을 열었다.


1. 이진 탐색


이진 탐색은 우리에게 널리 알려진 탐색 방법으로, 상당한 효율을 가지고 있다.

효율적인 탐색이 가능한 대표적인 자료구조는 트리이며, log2N의 탐색 성능을 가지고 있다.


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20


위의 자료에서 2라는 데이터를 찾기 위해 이진 탐색을 사용할 경우

데이터의 중간인 10부터 시작해서 원하는 데이터를 찾을 때까지 필요없는 부분은 버려나간다.


예를 들어 5는 10보다 작기 때문에 10보다 큰 10개의 데이터는 이제 안중에도 없는 것이다.

이렇듯 점점 반으로 줄여나가기 때문에 log2N의 수행성능을 보이며, 상당히 우수한 탐색 알고리즘이다.


참고 : http://terms.naver.com/entry.nhn?docId=2270440&cid=51173&categoryId=51173



2. 보간 탐색


여기서 더욱 발전된 것이 보간 탐색이라는 것인데

중간을 찍어 점점 줄여나가는 이진 탐색과는 달리

탐색하려는 대상에 비례하여 탐색의 위치를 결정하는 것이다.


2를 찾는다 하면 10을 찍는 것 보다 3이나 4등 2에 좀 더 가까운 수를 찍어 탐색 속도를 개선하는 것이다.



이진 탐색과 보간 탐색은 모두 정렬이 완료된 데이터를 대상으로 탐색을 진행한다.

보간 탐색은 탐색에 좀 더 효율적인 위치를 찍기 위한 계산 비용이 필요한데,

이 비용을 지불하더라도 이진 탐색보다는 훤씬 좋은 알고리즘으로 평가 받는다.


이제 이 위치를 찍기 위한 비례식을 구성하는 방법을 배워볼텐데, 다음 포스팅에 진행하도록 하겠다.

마지막으로 다시 한번 말하자면 이번에 배울 내용에서 가장 중요한 내용은


효율적인 탐색을 위해서는 '어떻게 찾을까'만을 고민해서는 안 되고,

그 보다는 효율적인 탐색을 위한 저장 방법을 우선 고민해야 한다는 것이다.


다음 포스팅부터 차차 위의 내용을 이해해 보도록 하겠다.



3 doors Down - Here Without you



우연히 접하게 된 노래인데, 요즘 이 노래만 듣고 사는 것 같다..

이런 가수가 있는지도 몰랐는데 이 노래가 WWE 월드스타 에디게레로의 추모곡이란다..

잔잔한 락풍의 노래같은데 상당히 애잔하게 들린다.



한 때 좋아했던 트랜스포머의 OST The Fray - Never say Never과 비슷한 느낌도 있고

상당히 좋아하는 에어로스미스와 느낌이 비슷한 거 같아 한번 듣고 완전 꽂혔던 거 같다.



수 많은 커버곡을 들어보았지만 역시 원곡자가 최고
하지만 어떤 누가 부르든 노래 자체가 상당히 애잔하게 들리는 것 같다.



동적 계획법 알고리즘 기초문제 - 동전1 (백준)


기존에 풀어오던 동적 계획법과 조금 다른 방식으로 접근을 해야해서

시간이 조금 오래걸렸다. 알고리즘을 오랜만에 풀어서기도 하겠지만

여전히 점화식을 세우는 것이 상당히 어렵게만 느껴진다.


이번 문제는 동전을 주고 해당하는 값을 이 동전으로 채울려면 몇 개의 경우의 수가 있느냐이다.


문제는 1,2,5원이 주어지고 10원을 채워야할 때 과연 경우의 수가 얼마인가.. 였다..

문제를 딱보자마자 dp배열에 다 때려박은 다음에 10원까지 쭉올라가다보면

답이 알아서 나오겠구나.. 생각했다..


기존에 동적 계획법을 풀때에는 답을 찾은 dp배열은 다시 건들지 않았다.

하지만 이번 문제는 답을 한번에 찾고 넘어가는 것이 아니라

다시 돌아와서 갱신을 해가면서 풀어야 한다는 것이다.

물론 기존에 찾은 답을 바탕으로 현재의 답을 찾는다는 동적 계획법의 기본은 충실하면서


동적 계획법 알고리즘 기초문제 - 동전1 (백준)



처음 들었던 생각은 1,2,3,4,5.... 차례로 쭉올라가면서 해당되는 값의 경우의 수를 찾아내고

그 수를 바탕으로 어떠한 점화식을 세운다면 답이 수월하게 나올줄 알았다.


하지만 값이 점점 커질수록 사용되는 동전의 수가 늘어나고 어떠한 규칙에도 예외가 생겨버렸다..

이 규칙을 찾으려 상당히 오랜시간을 고민했다. <-- 틀에 박힌 사고의 문제점


이 문제의 해답은 바로 dp배열을 점차 갱신해가며 답을 찾아 나간다는 것!

1,2,5원의 동전이 주어졌을 경우를 예로들어 설명을 하면


1. 1원 밖에 주어지지 않았을 때 1~k 값을 채울 수 있는 경우의 수를 구한다.

2. 2원 밖에 주어지지 않았을 때 2~k 값을 채울 수 있는 경우의 수를 구한다.

3. 5원 밖에 주어지지 않았을 때 5~k 값을 채울 수 있는 경우의 수를 구한다.


5원 밖에 주어지지 않았을 때 5원 이하의 값들은 5원의 영향을 받지 않기 때문에 제외.


하.. 동적 계획법은 정말 수학적 머리가 타고나야 하는 것 같다.

DFS, BFS의 경우에는 원리를 이해만한다면 어느정도 풀기가 수월하지만

동적 계획법은 공부를 하면 할수록 더욱 어려워 지는 것 같다..

Mikky Ekko - Stay



Disappear 이라는 곡으로 알게된 가수 미키에코

다소 몽환적인 노래가 많은 터라 매니아 층만 안다는 그런 가수이다.


Disappear 또한 상당히 몽환적인데.. 내 생각엔 호불호가 정말 심하게 갈릴듯 하다.

그의 노래 중에서도 상당히 유명한 노래가 있는데 (미키에코의 노래라기 보다 리아나의 노래)

리아나와 같이 부른 Stay라는 곡이다. 리아나의 버전과 미키에코의 버전이 있는데

개인적으로는 미키에코의 버전을 훨씬 더 선호하는 편이다.



또 하나 내가 이 노래를 정말 좋아하는 이유는 가사 때문인데


Not really sure how to fell about it

어떻게 그런 감정을 느끼는지는 모르겠지만


something in the way you move

너의 움직임은


make me feel like i can't live without you

너 없이는 내가 살 수 없을 것 처럼 느끼게 만들지


it take me all the way

그것은 나를 완전히 사로잡아


i want you to stay

난 네가 머물기를 원해


해석을 어떻게 하느냐에 따라 다르겠지만, 이 후렴부분과 더불어

전체적인 가사가 상당히 시적인 느낌



가장 좋아하는 라이브 영상은 아니지만
라이브중에 가장 잘 불렀다고 생각하는 영상



+ Recent posts