알고리즘에 관하여

geekforum의 이미지

저는 문과 계열을 전공하고 사무직 등 잡동사니(?)일을 하다가 뒤늦게 프로그램 쪽으로 뛰어든 사람입니다. 올 2월에 프로그램 개발회사에 들어왔는데, 당시 실제 개발이 막바지에 이르렀을 때라 제가 참여할 수는 없었고, 이른바 마케팅 담당. 실제로는 잡동사니 이런 저런 일을 하면서 지금까지 이르렀습니다.

처음에는 저녁먹고 밤 10시까지 회사에서 혼자 책보면서 공부했는데 회사 들어오기 전부터 책보면서 공부하고 학원다니고를 6개월 정도 했기 때문에 너무 지겨웠습니다. 실제로 프로젝트에 참여하면서 실력을 키우고 싶었는데 지금은 언제쯤 내가 진짜루 프로그램을 할 수 있을지 잘 모르겠네요.

자바를 했으니까 C#을 하라고 팀장이 그래서 또 밤 12시까지 회사에 있으면서 책을 봤죠. 며칠 보니깐 별루 할 게 없더군요. 자바와 비슷하고 역시 책을 보는 것은 한계가 있어서 진짜 프로그램을 하고 싶은데 지금 당장은 프로젝트를 할 수가 없고. 그렇다고 또 다른 언어를 익힌다는 거, 책을 본다는 게 너무 지겨워서 생각해보니 이것 저것 언어를 건드리기 보다는 기초를 닦아야겠다는 생각이 들었습니다. 제 생각이 맞는지는 모르겠지만. 그래서 알고리즘을 공부해야겠다고 결론을 내렸습니다.

전 6개월정도 학원다니고, 집에서 공부하면서 몇 가지 언어를 익혔지만 프로그램의 원리, 알고리즘이라고 하는 건가... 그런 거에 전혀 문외한이라서 시간이 있을 때 그쪽을 공부해두면 어떤 언어를 사용하든 효율적인 프로그램을 짤 수 있지 않을까 합니다. 지금 이 회사에서 저는 웹사이트 수정하거나 문서 작성등을 하고 있습니다. 남는 시간을 이용해서 알고리즘을 공부하려고 하는데 책을 보려면 어떤 책이 좋은지, 아니면 그냥 언어를 공부하는 게 나을지, 어떤 식으로 해야 좋을지 조언을 얻고 싶습니다.

댓글

익명 사용자의 이미지

하하 안녕하세요,

걱정이 많으시군요,

제 생각엔 경험 부족인 듯합니다.
욕심은 많고, 몸은 따라주지 않고

개발 툴들은 중요하지 않아요

어느 한가지에 빠져보세요
그럼 정말로 필요한게 보입니다, 그때 다른 툴들을
응용하세요

그리고
프로그램은 알고리즘 + 데이타입니다

여기서 중요한 것은
알고리즘이겠죠

예로든다면
당신이
어느 낯선 곳을 찾아가는데
가는 길들이 알고리즘이라고 생각하시면 될 겁니다.

빠른 길이 있는 반면, 느린길도 있고
이것은 알고리즘의 성능이겠죠

이런 방법을 절차적인 방법이라고 합니다
미리 순서가 다 정해져 있죠
다른 길이 없잖아요.

하지만 뛰어 넘거나 시간을 날아가는 방법도 있습니다
바로 비절차적인 방법이죠

아무튼 가는 길은 많아요 없으면 새로 만드세요
당신에게는 뛰어난 창의력이 있잖아요
그창의력이 바로 알고리즘이라고 보시면 됩니다.

익명 사용자의 이미지

현업에서 마지막에 걸리는 것이 알고리즘 & 자료구조 입니다.

초보자는 그 사실은 알아내지 못합니다.

필히 학습을 해야할 부분이며 이 부분이 어느정도라도

맛을 보고 가시지 않으면 언젠가는 꼭 이 부분때문에

막히는 것이 있습니다..제 생각은 필히 학습을 해다고...

학습이 이루어진 사람과 그렇치 않은 사람의 차이는

너무 크기에....(프로그래밍 수준차가 여기서 많이 나더군요)

익명 사용자의 이미지

프로그래밍은 책만 본다고 해결되는게 아닙니다. 직접 만들어 봐야 합니다. 프로젝트에 참여를 못해서 아쉽다고요? 자기변명밖에 되지 않는다고 생각합니다.
프로젝트에 참여를 해야지만 프로그래밍을 할 수 있습니까? 아닙니다. 책을 보는 시간을 조금 쪼개든지, 잠자는 시간을 줄이던지 해서 스스로 뭔가 하나의 목표를 정해서 프로그래밍을 해 보세요.
예를 들면, 주소록 프로그램 같은 간단한 것부터 시작하면 좋겠지요. 직접 프로그램을 만들다 보면 책에서 미쳐 보지 못했던 많은 것을 깨닭게 됩니다. 또한 더욱 빨리 자기것으로 습득하게 됩니다.
그리고 알고리즘은 당연하게도 매우 중요한 것중에 하나입니다. 이것은 문제해결능력을 가늠할 수 있는 중요한 능력입니다. 어떠한 문제를 접했을때, 그 문제를 어떻게 해결해 낼것인가를 생각해 내는데에 있어서 알고리즘이 뒷받침되지 않으면 올바른 해결책을 낼 수 없습니다.

프로그램 설계서대로 코딩만 잘하는 사람과, 설계서를 뛰어넘어서 스스로 다른 좀 더 좋은 효율적인 해결책을 제시할 수 있는 사람의 차이는 알고리즘에 있습니다.
물론 경험도 중요하겠지요.

마지막으로... 제가 생각하는 알고리즘의 기초는 1부터 10까지 더하는 프로그램을 서로 다른 알고리즘으로 10가지를 만들어보는게 아닐까 합니다.
1부터 10까지 더하는 간단한 프로그램이 10가지나 나올수 있냐고요? 마음만 먹는다면 100가지로도 만들어낼수 있습니다. ^^

다타만의 이미지

제 생각은 조금 다릅니다.

프로그램을 짤데 알고리즘을 많이 안다는것은 정말 중요합니다.

하지만 프로그램경력이 많지 않으시고.. 중급프로그래머로 프로그램을 짜실것 같지는 않은 상황인듯한데요

제가 PM 이라면 프로그램을 잘짜는 중급 프로그래머와 코딩을 잘하는 초급 프로그램머를 쓰겠습니다.

알고르즘이 우수하거 안다루어본 언어가 없고 커널을 분석할줄 알지만 타자가 느리고 커밋과 롤빽을 이해 못하는

초급자보다는 약간의 디자인도 하고 옵다루는 에디터가 없고 단축키를 귀신 같이 쓰며 만은 종류의 데이타

베이스에 프로그램을 연결할줄 알며 데이타베이스가 어떤 원리로 돌아가려는지 이해하려고 노력하는

초급프로그래머를 더욱 우수하게 인정해줄것 같습니다.

업무를 모르고 현업사람들이 원하는것이 무엇인지 잘 모르는 초급프로그래머다 아무리 프로그램을 우수하게

짠다하여도 프로그램을 잘 못짜는 중급과 만나면 트러블만 발생하지 실제로 프로그램을 잘 짤수있으리라고는

생각하지 않거든요..

yaplab의 이미지

제대로 된 대답인지 모르지만 저도 사실은 흔히 말하는 문과 출신입니다. 대신 차이라면 전공 강의시간에 뒷자리에 앉아서 파스칼 교재 같은거 읽었다는 정도 차인가요?
제 생각에는 알고리즘을 공부하시는 것도 참 좋은 일이라 생각되지만 제 짧은 생각에는 알고리즘만 해서는 안될거 같습니다. 알고리즘은 정말 프로그램의 기초가 되는 부분이고 이론적인 측면도 상당히 중요하지만 제가 생각하는 것은 이런 세가지 정도가 아닐까 생각합니다.
첫째, 알고리즘을 배우는 것은 컴퓨터 프로그래밍 적인 사고를 하는 방법을 배우는 것입니다. 순차적인 처리든 병렬적인 처리이든 처리를 하는 컴퓨터에 일을 시키는 입장이 되도록 노력하는 것입니다. 물론 컴퓨터에 일을 시키려면 컴퓨터가 어떤 구조로 되어 있고 어떤 방식으로 처리를 하는가 하는 것은 기본적으로 알아야 할것 같습니다. 이런 것을 배우려면 window 2000이나 linux의 커널 구조나 기본 지식들을 잡다하게 쓴 글들을 찾아 읽거나 잘 몰라도 OS에 관련된 지식을 많이 열거한 자료들을 찾아 여러번 읽어 보는것이 도움이 되지 않을까 합니다. 그리고 다른 사람들의 코드를 보면서 (짧은 것으로) 프로그램을 어떤식으로 짜는지 감을 익히는 것이 좋지 않을까 합니다. 운전면허가 있는 것과 운전을 할줄 아는 것은 차이가 있죠. 프로그램 문법을 아는 것과 프로그램을 짤줄 아는것은 그런 차이가 있다고 생각합니다. 운전을 많이 한 사람이 운전을 점점 잘하게 되는 이치와 같죠.
두번째, 쓸 프로그램을 짜보세요. 알고리즘을 연습할때는 자료구조론(데이터스트럭쳐)에 나오는 개념들을 짜 보는 것이 많은 도움을 주겠지만 일단 어느 정도 된 다음에는 필요한 프로그램을 짜는 것입니다. 아무도 쓰지 않고 나도 별 필요 없는 것을 짜는 것은 노는 손을 운동시키는 데 도움은 되겠지만 늙어서 관절염으로 고생합니다. 차라리 책을 보면서 컴퓨터관련 지식을 더 쌓으세요 (새로운 운영체제나 기존의 운영체제, 프로그램, 기반 기술들..) 왜냐하면 특별하게 목적이 없는 프로그램을 짜면 목적의식도 희박해지고 자기가 아는 정도의 수준으로만 코딩하게 됩니다. 그럼 별로 도전할것도 없게 되는 거죠. 목표를 정하고 그 목적에 부합하는 프로그램을 짜기위해 노력하다보면 난관에 부딪히고 그것을 뚫고 나가면 조금 실력이 늘게되죠.
세번째, 프로그래머에게 일을 시킬 수 있는 지식을 쌓으세요. 많은 기본적인 프로그램들 (메일, 데이타베이스, 운영체제, 브라우저 등 )을 짜실게 아니라면 쓸데없는데 너무 많은 시간을 낭비하지 마세요. 그런일을 한다면 GNU의 성당과 시장 (맞나??? )의 비유를 읽어보세요. 그렇지 않다면 업무에 쓸 프로그램을 짜는 프로그래머가 되려면 먼저 그 업무를 완벽히 이해하세요. 완벽하지 않아도 적어도 일을 시킬 정도는 아셔야 합니다. 그래야 앉아서 프로그램을 짜게되죠. 주식에 관해서 깡통인 프로그래머가 앉아서 주식 투자분석 프로그램을 단숨에 짜 낼수는 없겠죠?
제 생각에 이정도만 하면 업무에 적용되는 프로그램을 짤 줄아는 프로그래머가 될 수 있다고 생각합니다. 제가 저의 경험에만 비추어 짧은 견해를 밝혀서 노하시는 프로그래머가 있으시더라도 그냥 한 견해라고만 생각하시기 바랍니다.
^^

<<-
좋은 프로젝트 있으면 소개시켜줘~ *^^*
->>

익명 사용자의 이미지

좋은 선택입니다.

프로그래머의 기본인 알고리즘을 공부하는건 당연하죠

그리고 요즘은 자바로 알고리즘 책들이 많이 나오더군요..

제가 공부할 때는 "C로 쓰는 알고리즘"이라는 책을

봤었는뎅.. 괜찮더군요..

ps. 외국책은 되도록.. 원서를 사시길.. T.T

한글판은.. -_-;;; 절대 사지마세여..

익명 사용자의 이미지

학기초에 suffix tree 구성에 관한 알고리즘(논문 2편)을
본 적이 있는데, 그거 이해하는데 꼬박 일주일이
걸렸고, 이해할때까지 논문만 붙잡고 있었습니다.
물론 구현이야 내용을 이해하지 않아도 거기에 나온
pseudo code대로 구현하면 할 수 있었겠지만, 그렇게 되면
알고리즘을 공부하는 것이 아니죠. 즉, 진짜 알고리즘은
컴퓨터 꺼놓고 책만 붙잡고 뚫어지게 보면서 공부하는
겁니다.-_-;;

당연히 글 쓰신 분이 그런 본격적인 알고리즘 공부를
원하시는게 아니라면, 알고리즘 보다는 자료구조를
공부하는게 보다 적합할 듯 합니다.
그리고 자료구조 이후에 좀더 어드밴스한 내용을
원하신다면 유명한 Introduction to Algorithms 책
(소위 CLR책, 'CLR'은 책 저자들의 이름에서 글자를 딴 것)
정도까지는 보시는 것도 괜찮을 듯 합니다.

익명 사용자의 이미지

좀더 부연하자면,
알고리즘은 '어떤 특정한 문제를 해결하기 위해 논리적인 전개 과정을
나타낸 것'이라 볼 수 있습니다. 예를 들어 가장 쉽게 접할 수 있는 것이,
sort와 string match, graph에서의 shortest path 문제입니다.
하지만 반대로 그 외 알고리즘은 알 기회가 거의 없습니다. 쓸 일도 없구요.

그냥 각각 대표적인 알고리즘 정도만 알고, Dynamic programming이니
divide and conquer니 하는 방법론 정도만 알면 충분할 겁니다.
진짜 알고리즘쪽으로 공부하러 나선거 아니면 말이죠.

사실 알고리즘 공부를 한다고 자신있게 말할려면,
string match만 하더라도,
naive 알고리즘, KMP, Kabin-rarp, suffix tree 정도는 알아야 합니다.
sort라면 bubble, insertion, selection, quicksort, heapsort, counting,
radix, bucket... (정말 많군요-_-;;) 정도는 알아야 하구요.
또한 알고리즘의 성능 분석은 기본으로 할 수 있어야 합니다.
하지만 그런거 다 아는거랑 프로그래밍 공부는 전혀 관련없고 별 도움도
안됩니다.

대표적으로 리눅스 커널 소스에서 알고리즘이 몇개나 사용되었을 것 같습니까?
위에서 언급한 대표적인 문제의 알고리즘을 제외하고는 거의 없을 겁니다.
오히려 커널 소스 분석하다보면 엄청난 수의 자료구조와 그 복잡성에 혀를
내두르게 될지도 모릅니다. 또한 실제로 많은 프로그래밍에 있어 자료구조를
어떻게 선택하느냐가 구현 복잡도를 크게 좌우하는 경우가 훨씬 많습니다.
알고리즘은 수행 성능을 결정하는 것이지요.

익명 사용자의 이미지

제 선배가 한 말중에 '삽질하는데 대학나온게 뭔 소용이냐?' 란 말이

있는데 컴퓨터 분야가 워낙 넓기 때문에 대학에서 배운게 필요한 곳도

있고 필요하지 않은 곳도 있습니다. 목욕탕 타일 깔려고 시멘트 갤때는

삽질만 해도 충분하지만 고층 빌딩 지으려면 골리앗 크레인이 필요하겠죠.

스레드 처음 시작하신 분은 그냥 취미 삼아서 공부하시려는 것 같은데

이런 저런 이유 따져 가면서 안하는 것보다는 좀 어려워도 한번쯤 해보는게

자기 호기심을 충족시키는 길이라고 봅니다.

ps. 오타가 있네요 kabin-rap 이 아니라 Rabin-Karp 죠.

익명 사용자의 이미지

비유가 너무 추상적인데,
알고리즘을 공부한다고 해서 꼭 고층 빌딩 짓는데 도움된다는 건 아니라고 봅니다.

좀더 정확히 비유하자면,
자료구조는 간단히 시멘트 깔고 벽돌깔고 하는 기술이라서
웬만한 공사에는 빠질 수 없는 기본적인 것이라면,
알고리즘은 어떤건 다리에서 하중을 분배하는 특정한 공법에 관한 거라서
다리가 아닌 일반 건물을 지을때는 전혀 도움이 안되고, 어떤 건
고층빌딩의 철골구조에 관한 공법이라서 또 다른데는 전혀 써먹을 수 없는,
(건축쪽에는 아는바가 없어서 적절한 비유인지 모르겠습니다만)
그런 성질의 것입니다.

따라서 제가 얘기하고 싶은 내용은,
알고리즘 입문 정도는 취미로 공부할 수도 있겠지만
그게 기대만큼 별 도움이 안될지도 모른다는 겁니다.
(더구나 이론에서만 우수하고 실제적으론 거의 가치없는 알고리즘들도 많죠.)

오히려 일단 자료구조를 다지고
좀더 심도있는 내용을 원한다면 CLR 정도에서 보고 싶은 부분만 골라 보고,
좀더 부족하다고 느끼면 해당 주제에 관한 알고리즘을 직접 찾아 공부하는게
보다 유용할 것 같습니다. 압축에 관심있다면 LZ77, LZW, Adaptive Huffman V,
혹은 bzip으로 최근에 급부상한 block sort 방식 등을 찾아보시는게 좋겠네요.

PS. 이것저것 안따지고 순전히 취미로 따진다면 굳이 알고리즘이 아니라
오토마타를 공부하시는 것도 좋을 듯 하군요.
(참 허접하게 느껴지는) 튜링기계에 관한 부분을 읽어보고
앞에 놓인 컴퓨터를 바라보면 새로운 감회를 느끼실 수 있을 겁니다.

익명 사용자의 이미지

빼먹었는데

http://hissa.nist.gov/dads/terms.html

요기는 좋은 알고리즘 관련 사이트. :)

익명 사용자의 이미지

알고리즘 배우고 문제를 마니 풀면 코딩실력이 팍느는것 같더군요 ^_^;;

지금은 절판되었지만 "C로 작성한 활용알고리즘" 이라는 책이 젤 좋았구요....

번역서 중에는 사이텍미디어에서 나온 "알고리즘"이 젤 좋았던듯~~

white23의 이미지

음... 책이 보는게 지겨우시다고요???
전 시간만 되면은 책만 딥따 봤으면 좋겠는데???
요즘엔 책을 볼 시간이 너무 엇어서릿...
요즘은 사는 책의 절반도 소화를 못해내고 그의 쌓아만 두고있네요... 햐~~~

근데... 님께서 어느정도의 책을 보셨는지는 몰라도 이정도는 보셨겠죠?
Stevens의 전질(전부 6권인데... 어디 하나 버릴때가 없는 책들입니다. 아마도 Stevens의 책을 본적이 있는 사람이라면 다들 느끼실 겁니다.)
그리고 Kernghan & Ritchie의 "The C Programming Language"
그리고 A Book On C나 기타 등등의 잡서...
너무 좋은 책이 너무 많고 보고 싶은 책들이 너무 많아 전 아주 행복합니다...
이것들 보면은... 알고리즘... 그냥 슬쩍만 봐도 다 보입니다(제가 뻥이 좀 쎄죠...^^)

제가 책들에 관해 좀더 자세히 그리고 많이 소개를 해드리고 싶은데...
지면관계와 어제도 역시 밤을 샌 관계로 피곤해서 더 자세히는 힘들것 같네요...
여하튼 좋은 책들 많이 보시고 좋은 해커가 되시길...^^
(여기서 '해커'라 하면 호시탐탐 남의 컴을 노리는 구린 놈들(이런 부류의 인간들을 우리는 '크래커(절데 과자 아님)'라 부른다.)이 아니라 무언가에 몰두하고 모두에게 도움이 될 수 있는 프로그래머)

그럼...

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

어떠한 역경에도 굴하지 않는 '하양 지훈' - It's Now or Never!!!

익명 사용자의 이미지

stevens???

W.Richard Stevens??
Roger t. Stevens??
or any other person??

now what writing book above ?

익명 사용자의 이미지

maybe W.Richard Stevens...

his book is very good and popular ones.

익명 사용자의 이미지

저도 stevens 의 책을 한글판으로 사는 어리석은짓을 했답니다

지금 피눈물 나게 후회하고 있구요.. 지금은 도서관에서 빌려보고 있답니다 ㅠ.ㅠ

그리고 저도 a book on c 보는데.. 정말 좋더군요

그리고 좋은책좀 많이 추천해주세요~

익명 사용자의 이미지

저는 Unix Network Programming vol.1을 번역서로 사서
샀을 때 처음은 후회했습니다만, 익숙해지니 꽤 재미가 쏠쏠하더라구요.

정말 기발하지 않습니까? 보쌈과 대롱이라는 표현 ^^
그래서 Advanced Programming in the Unix Environment랑
Unix Network Programming vo.2 모두 번역서로 샀답니다. :)

생소한 단어가 나오면 색인을 찾아 보세요.
나름대로 어떤 철학을 가지고 번역한 것 같아서 좋아합니다.
뭐 실제 어떤 사람들이 어떤 방법으로 번역했는지는 알 수 없지만요.

용어가, 업계의 수준을 뛰어넘는 너무 파격적인 선택이라는 것이 문제입니다.
귀찮으시더라도 보쌈(packet), 대롱(queue) 뭐 이런 식으로 처리하셨으면 더 좋았을 것을

집에 아까운 책 놓아두지 마시고 즐기시길
혹시 아나요.
동료들과 대화를 나누며 이런 이야기를 듣게 될지.
'이씨, 보쌈이 너무 커서 파수꾼이 자꾸 죽어' :)

익명 사용자의 이미지

절대 어리석은 짓 아님니다. 저도 한글판을 사서 공부를 했는데,
어떤 고참사원이 그러더군여, 워낙 번역이 개판이라서, 다시 원서를
사서 참고를 하면서 봤노라고 ...., 근데, 그분이 그 책내용에 대해
별로 아는게 없더군여 ...
이해 하기 어려울 정도로 번역이 개판인 책은 없습니다.
사실 스티븐은 책들이 전공자라 하더라도 그리 쉬운 책은 아닙니다.
제 짧은 견해로는 번억자도 나름대로, 한글 용어를 채용하고 싶어서
고심하지 않았나 생각이 드는데, 스티븐책의 번역서 그리 나쁘다는 생각
하지 않습니다. 아무튼 행운이 있으시길 바랍니다.

익명 사용자의 이미지

글쎄요.. 차라리 전.. 한글판 보다
원서가 더 이해가 잘되네요..
앞부분은 알던내용이라서 그런데로 봤는데 뒤로 갈수록 용어도 이상하고..

메아리 서버 이런건 대충 이해가 가지만.. 뒤에 나오는 이상한용어들.. 미쳐~

익명 사용자의 이미지

대학에서 컴퓨터전공으로 가르치는 과목들은 다음과 같습니다.

자료구조
알고리즘
데이터베이스
네트워크
운영체제
컴퓨터구조

이 중에서 자료구조하고 알고리즘은 서로 연관되는 부분이 많아서 같이 공부하는 경우가 많구요.
기초가 되는 부분이기 때문에 여러분들이 이미 말씀하신것 처럼 탁월한 선택이시라고 생각합니다 ^^

역시 여러분들이 이미 말씀하신것처럼 자료구조에 초점을 맞추시라고 권해드리고 싶구요.
스택, 큐, 링크드 리스트, 해쉬테이블, 트리 등이 많이 쓰이는 자료구조이니 꼭 공부하시구요
Big Oh notation을 아시면 자신의 프로그램의 성능 평가에 대해 눈을 뜨실 수 있으니 역시 꼭 공부하시구요
그래프 부터는 알고리즘이 많이 들어가는데 실제로 많이 쓰이지는 않습니다 ^^

그 다음에 하시는 일이 데이터 베이스에 관련된 일이라면
데이터 베이스를

네트웍 관련 일이라면 네트워크를

어플리케이션 프로그램 쪽이라면 운영체제를

공부하시면 좋을 것 같구요

제 개인적으로는 정말 좋은 프로그래머가 되려면 컴퓨터 구조도 꼭 공부해야 된다고 생각합니다~~

공부할거 정말 많죠...
모두들 파이팅~~

익명 사용자의 이미지

제 생각입니다만 이것저것 많이 배운다고 아주 좋은것도 아닌것 같습니다

학부 저학년때 목표를 생각하는게 좋은거 같아요

이것저것 들어가며 찾겠다고 하면 많이 돌아갈듯...

bxhs의 이미지

지금껏 짧은 기간동안 경험한 것은..

1)C 자료구조

2) 유닉스 시스템 프로그래밍

이 두개가 제일 중요하다고 생각되요.

자료구조는 뭘 하든 나오는거니까..
반드시 해야되고,

2번은 유닉스를 안다루더라도,
윈도우 시스템프로그래밍이나 임베디드쪽이나
어디든 해야한다고 봅니다.

사실 저는 시스템프로그래밍 꽝이에요 ^^;

Renn의 이미지

자료구조와 알고리즘은 연관이 아주 깊으니... 같이 알아야
할 듯 하겠죠? :-)

언어적으로는, 아무래도 C가 좋다고 생각됩니다.
자료구조에서 알고리즘에 이르기까지 모두 사람이 만들어
줘야 하는 불편이 있지만, 그만큼 원리와 구조를 확실하게
알 수 있다고 생각되기 때문이죠.

자바같은 (아마 C# 도?) 고급언어는 C 로는 직접 코딩해야
했던 수많은 자료구조들이 이미 API 로 존재합니다.
물론, 그 API 를 쓰지 않고 해도 되지만, 그것은 고생만
하는 것이겠죠. ^^;;;

최근에 요상한 문제를 하나 풀고 있는데,
알고리즘 연구는 정말 노가다 입니다. -_-;;;
규칙찾기... 휴우......;;;;;;;;;

- 잡담성 글을 적어버렸군요. ^^;;;;;

익명 사용자의 이미지

카네기 멜론에서 공부하는 유학생입니다.
이곳에서는 자료구조를 JAVA로 하는 추세입니다.
제 생각에 그 이유는 JAVA가 문법적으로 깨끗한 언어여서 언어 자체에 신경쓰는 부담을 덜어 주는 것 같읍니다. 배우는 학생들은 오로지 자료구조와 알고리듬에만 집중을 하지요.

익명 사용자의 이미지

비 전공자가 보기에 제일 좋은 책은

'C 로 배우는 알고리즘 1,2' 입니다.

이 책 쓰신 분이 모르기는 해도 다른 유명한 자료구조나

알고리즘 책을 참조한 것 같은데 저자가 충분히 내용을

알고 소화해서 썼기 때문에 설명도 자세하고 보기도

좋습니다.

좀더 깊이있게 공부하려면 MIT press 에서 나온

Introduction to algorithms 나 Horowitz 가 쓴

Computer Algorithms 같은 책이 좋습니다.

Horowitz 의 책을 보면 컴퓨터 사이언스에서 전통적으로

문제 해결을 위해서 사용하는 방법들을 하나씩 다루고

있습니다.

이쪽에 대해서 잘 모르시면 일단 C 로 배우는 알고리즘을

공부하신 다음에 중고등학교 정보처리(?) 올림피아드

문제집 같은 것을 구해서 (서점에 가면 몇권 있습니다.

웹 사이트도 있고..) 거기에서 예제로 들고 있는 문제들을

하나씩 풀어보시면 이미 알고 있는 지식들을 사용해서

문제 해결에 적용할 수 있는지 알 수 있습니다.

Problem Solving 이라는 타이틀로 검색을 해봐도

꽤 많은 책이 나올 것입니다.

결론적으로

기본적인 알고리즘과 자료구조에 대한 지식 + Problem Solving Skill 을 익히시면 되겠죠..

익명 사용자의 이미지

Horowits 책 우리말 번역판은 사지 마세요.
번역 정말 개판이더군요.

logout_의 이미지

제 생각에도 알고리즘보다는 자료구조를 권합니다. 기본적으로 링크드 리스트, 바이너리 트리 정도만 잘 알고 있어도 데이터를 처리할 때 자료구조를 잘 모르는 사람에 비해 몇 배는 효율적인 코드를 만들어 낼 수 있습니다. 게다가, 자료구조를 공부하다보면 필연적으로 dynamic memory allocation을 많이 연습하게 됩니다. 프로그래밍을 하면서 static과 dynamic의 차이를 확실히 구분할 수 있는 것과 없는 것은 엄청난 공력의 차이를 불러오게 됩니다.

익명 사용자의 이미지

알고리즘을 선택하신것은 정말 현명한 선택입니다.
많은 분들의 의견과 같이 기초없는 건물, 높이 올라가지 못하니깐여. 근데, Java나 C# 이나 C++ 이나 객체지향을 선전하는 많은 대다수의 언어들은 이미 컨테이너 셋이라불리우는 일종의 알고리즘 툴셋을 제공하고 있습니다. C++ 에서는 STL 이구 Java 에서도 많은 클래스가 있지여. 당연히 C#도 제공할 것입니다.

4~5년전만 하더라도, 알고리즘의 자체구현은 어쩔수없는 필수였지만 시대가 변하고 패러다임이 변한지금은 책에서 배운 알고리즘을 자신의 실력으로 구현하는 것보다, 있는 알고리즘을 어떻게 써 먹을 수 있는가 하는 것에 더 비중을 둬야 한다 봅니다.

C에서 LInked List 나 Queue 같은 것은 어느 알고리즘이나 자료구조에서도 약방의 감초처럼 등장하지만, perl 에서는 구현이고 나발이고 없이 그냥 HASH reference 를 쓰면 땡입니다. Linked List 는 HASH Referece를 사용해서, Queue는 ARRAY를 이용해서 말이져. 게다가 perl 에선 HASH ref. 의 ref 에 ARRAY ref. 까지 지 꼴리는 데루 섞을 수 있으므로 그 자유로움을 이용한다면 왠만한 형태의 자료구조는 쉽사리 표현되지여. (언어를 자랑할려고 하는게 아닙니다)

이렇듯, 자료구조와 알고리즘의 중요성이 몇년사이에 크게 두각되고 이를 위한 언어자체의 지원도 많아진 지금, 저의 생각은 확실히 "활용"측면에 유의해야한다는 주장이져. 물론 알고리즘 자체를 공부하지 말아야 한다는 게 아닌거 아시져?^^

알고리즘은 자료구조에 영향을 직방으로 받게되고 어떤 자료구조인가에 따라 뺑이냐 happy한 퇴근이냐가 결정된다해두 별 말씀 없을 것으로 봅니다. 그러므로 자료구조는 필수. 그중에서도 HASH, LinkedList는 뻔질나게 사용하는 항목중 하나. 또한 강력한 Graph .. 등이 있겠져.

또한, 객체지향으로 나가실것 같으면 디자인패턴을 공부하지 않고는 탄탄한 기초를 쌓긴 힘들져.

익명 사용자의 이미지

개인적으로는 알고리즘보다는 자료구조를 권하고 싶군요.

알고리즘도 중요하긴 하지만, 대부분의 프로그램에 들어가는 알고리즘은 간단한 것입니다. 더구나 애플리케이션의 요즘 추세는 time critical한 것보다 빠른 개발 주기를 원하기 때문에 그다지 어려운 것은 없습니다.

물론, 알고리즘을 핵심 개발자가 어느정도 짜게 되지만, 역시나 논문 수십장 올라오는 그런 알고리즘과는 거리가 멉니다.

프로그램을 짜는 것을 전업으로 삼을 셈이라면, 기회를 잡아서 야간이라도 컴퓨터전공을 들어보는 것이 가장 좋다고 생각합니다.

책에 있는 예제나 실습을 우선 해보고, 평소에 관심을 두거나 이런건 해볼수 있겠다 싶은 작은 프로그램을 혼자서 짜보는 것도 저같은 경우는 많은 도움이 되었었습니다.

회사에서 프로그램을 팀단위로 한다면, 소프트웨어공학에 관한 간단한 책을 읽어 보는 것도 굉장한 도움이 됩니다. 화이팅~!

익명 사용자의 이미지

다른야긴데여..

혹시 "자바로쓴 자료구조(알고리즘)"책중 괘않은거 알구계신분 있으시면 추천부탁드립니다..

익명 사용자의 이미지

저희 학교에서 쓰는 교재인데요...
Mark Allen Weiss, Data Structures & Algorithm Analysis in Java
Addisson Wesley

그런대로 읽을만하더군요... ㅡ.ㅡ

익명 사용자의 이미지

Data Structure & Problem Solving
Using JAVA
Addison Wesley

자료구조 수업을 들을때, 자바로 자료
구조를 배웠습니다. 수업 때 교재였죠.

익명 사용자의 이미지

정말 기본이 중요합니다.

잘될나무는.. 떡잎부터 알아본다는 말이 있지 않습니까?.

기본이 바탕이 된 응용은 무한 가치를 지닙니다.

익명 사용자의 이미지

정말 맞는말

익명 사용자의 이미지

자료구조와 알고리즘도 상당히 중요하지요.

더불어 운영체제, 네트워크, 오토마타,

데이타베이스, 소프트웨어공학 이 부분도

더디겠지만 조금씩 하셔야 합니다.

앞서 말한 부분이 바탕이 되야지 좋은 개발자가

될수 있습니다... 노력하십시오..

그럼 ~*

앙마의 이미지

제 생각으로도 시간적 여유가 되신다면, 자료구조와 알고리즘을 공부하시는게 좋다고 권하고 싶군요.
음... 이건 수업시간에 들었던 이야기인데...
(아.. 전 컴공 전공자입니다.)
프로그램 = 자료구조 + 알고리즘
이렇게 정의를 하기도 하더군요.
그만큼 프로그램을 짜는데 있어서 자료구조와 알고리즘이 중요하다는 이야기일겁니다.
그리고 언어는 제 생각에는 C와 C++정도를 완벽히(?)
하실 정도면 다른 언어는 금방 익힐수 있다고 생각합니다. 제 경험상으론 다른 언어의 레퍼런스만
보고서도 간단한 프로그램의 작성은 가능하더군요.
제 생각에는 "C로 쓴 자료구조론", "C++로 쓴 자료구조론" 정도가 괜찮은 책이라고 생각되는군요.
위 책에선 자료구조와 알고리즘을 동시에 다루고 있으므로 두마리 토끼를 잡는것도 가능합니다.
단, 문제가 있다면... 조금 어렵습니다.
그럼... ㅋㅋㅋ

autography

인간에게는 자신의 운명을 거부할 권리가 있다.

익명 사용자의 이미지

안녕하세요? ^^

그동안 게시글만 보다가 첨으로 글 올려보네요..

(입이 간질거려서.. ^^)

프로그램 = 자료구조 + 알고리즘

라고 말씀을 하셨는데, 그런 책 제목이 정말로 있어요..

Algorithms + Data Structures = Programs

이라고, Pascal을 만들고 그 후에 모듈라, 오베론 등등에도

많은 간여를 한, 전산학 분야에서 아주 유명한

Niklaus Wirth 라는 사람이 썼죠.

지금은 잘 기억이 안 나지만 자료구조에 프로그래밍 스타일,

알고리즘 조금 정도의 성격의 책이었던 것 같고요.. ^^

이걸 본딴 책 제목으로

Genetic Algorithms + Data Structures = Evolution Programs

라는 것도 있답니다. ^^

가끔 재미삼아 인용해 보세요~

익명 사용자의 이미지

저도 님과 같은 책 가지고 있는데 참 좋더라고요.
예전에 수업 때문에 샀는데
"C로 쓴 자료구조론", "C++로 쓴 자료구조론" 번역서랑 원서 둘다
가지고 있습니다.

참 좋더라고요. 지금은 화장실용도로 이용되고 있지만요.. ㅋㅋㅋ

redbaron의 이미지

두분다 우리 학교신가부다..ㅋㅋㅋ

익명 사용자의 이미지

어느학교죠?

우리학교 같은데...*^^*

jungho_gun의 이미지

알고리즘 관련한 글타래를 검색하다가 답글내용이 좋아서 끌어올립니다.

===========================================
누구나 실수는 한다. 나도 예외는 아니다.

===========================================
누구나 실수는 한다. 나도 예외는 아니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.