[Info]Tags categorized posts and contents patterns..

[AJAX] Ajax Code E xamples.. [Book] About the book.. [CSS] CSS Code E xamples.. [DB] Sql Code E xamples.. [DEV] All development stor...

레이블이 알고리즘인 게시물을 표시합니다. 모든 게시물 표시
레이블이 알고리즘인 게시물을 표시합니다. 모든 게시물 표시

2016년 8월 4일 목요일

[Tool] 이클립스 네온 다운받기..

면접을 보고 난 얘기를 하고서 바로 뒤이어 포스팅을 또 한다.. 이번 글은 이클립스 네온 다운로드 및 Hello World 출력 하는것이다.. 다만, 시점이 시점인 만큼 Hello World 출력하는법 자체는 설명하지 않을 것이다.. 나도 오랫만에 이클립스를 다운로드 받다보니 혹시라도 다운로드 하는 곳이나 어떤 것을 받을지 고민하시는 분이 있을 수 있어서 올려본다..

이클립스를 왜 받느냐.. 알고스팟에서 알고리즘 테스트를 하고 하려면, 우짜든둥 툴이 있어야 될거 아닌감..??!! 그래야 코딩을 하지.. ㅋㅋ 그래서 해당 포스팅을 하게 된 것이다..

무튼..!! 우선은 이클립스 사이트를 간다.. 네이버누님에게 이클립스 내지는 eclipse, eclipse neon 으로 검색을 하면 아래처럼 보일 것이다.. eclipse 사이트로 이동한다..






사이트를 이동하면, 아래처럼 보일 것이다..













빨강색으로 표시한 부분을 클릭하면 실제 다운로드 페이지로 이동한다..

















빨강색 표시한 부분을 클릭하면 되는데 우측 하단을 보면 본인 운영체제에 대한 bit 표기가 있다.. 32 bit 인지 64 bit 인지 확인해서 잘 다운 받으면 된다..











위처럼 다운을 받아서 압축을 풀고 실행 시키면 되는데.. 난 기본 프로젝트를 생성해서 Hello World 를 간단히 타이핑 후 실행[Ctrl + F11] 시켜봤다.. 

















모두들 잘 되겠지..?? 이건 진짜 클릭 클릭만 하면 되는거니까.. ㅎㅎ 이제 알고스팟에 가서 회원가입도하고, 사이트도 좀 둘러보고, 코딩 테스트도 샘플로 해보고 해야겠다.. 혹시라도 내가 들어간게 알고스팟이 맞는건가..?? 하는 분들을 위해서.. 사이트 진입페이지 남겨드린다.. 참!!! 코딩 테스트 후 내가 한것을 공부도 할겸 정리도 할겸 포스팅 할 계획이다.. 후훗..

















2016년 4월 15일 금요일

[EP]Google Code Jam 참가 후기..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

Google Code Jam 2012에 참가했습니다. 구글 코드잼은 구글에서 매년 진행하는 알고리즘 경진대회입니다. 항상 이맘때쯤 진행하는데 알고리즘 문제를 몇개 주고 시간내에 이를 프로그래밍해서 답을 제출하는 방식으로 진행이 되고 그걸로 순위를 매깁니다. 어떤 의미해서는 개발자들의 축제(?)라고 할 수도 있고 이런 식의 알고리즘을 푸는 것은 ACM이나 ICPC 대회라고 부르고 코드잼외에도 수많은 사이트들이 있습니다. 구글처럼 대형기업에서 진행하는 것은 페이스북의 Hacker cup이 있습니다. 구글은 한지 수년된 걸로 알고 있고 Hacker cup은 작년에 처음 한것 같습니다. 국내에서는 올해 처음으로 코드잼 코리아가 진행되었습니다.

code jam 로고
제가 알고리즘은 잘 못 풀기 때문에 아주 얕은 경험이지만 이번에 하다보니 코드잼을 잘 모르는 사람들도 많고 저도 처음에 하면서 불필요한 헛발질들도 좀 한 관계로 내년에 참가해보려는 사람들에게 도움이 좀 될까 하고 코드잼에 대한 내용을 적어봅니다.

코드잼 기준으로 Qualification Round이 예선전입니다. 일정점수(보통 20점) 정도를 넘으면 QR 통과입니다. 통과하면 Online Round 1로 가고 Online Round 1은 총 3번 진행합니다. 3번 중 아무거나 참여해서 1,000명 안에 들면 Online Round 2로 진출합니다. 총 3번 진행하니까 3,000명이 Online Round 2로 진출하는 것입니다. 물론 3개 다 참여해도 됩니다. 문제를 풀면 점수가 나오고 문제를 푼 시간까지 포함해서(제출했는데 틀리면 페널티를 먹는데 시간으로 페날티를 먹습니다.) QR에서는 점수만 보기 때문에 페널티가 의미 없습니다. QR은 보통 24시간정도의 시간이 주어지지만 그 다음부터는 2시간 반내에 풀어야 합니다.(Round 2는 못가봐서 그 뒤부터는 잘 모르겠네요. 거기까지 가신 분이 이 글을 참고하고 있진 않으실 테니...)

코드잼 대회전에 알고 있어야 할 것들
문제는 보통 A, B, C 3개가 나오게 됩니다. 해커컵도 거의 비슷하게 진행이 되는데 어떤 문제인지 설명이 죽~ 나옵니다.(물론 영어로요.) 인풋을 주는데 인풋 파일을 프로그램에 입력하면 아웃풋을 출력하는 형태로 이루어집니다. 그래서 결과는 아웃풋파일을 제출해서 답이 맞는지 안맞는지 검사하게 됩니다.


C-like

4
3 1 5 15 13 11
3 0 8 23 22 21
2 1 1 8 0
6 2 8 29 20 8 18 18 21

인풋은 보통 위와 같은 형식입니다. 맨 위에 4는 문제가 4개라는 의미이고 보통은 한라인에 한문제씩인데 경우에 따라서는 아닌 경우도 있습니다. 각 라인의 값이 무엇을 의미하는지는 문제에 따라 다르지만 위처럼 여러개의 값을 공백으로 분리해서 나타냅니다. 그래서 미리 인풋파일을 읽어서 파싱하는 코드정도는 짜두는게 좋습니다.(이건 어느 문제에서나 해야되는 거니까요.) 저는 보통 첫라인은 읽지 않고 라인별로 리스트로 만들어서 처리하지만 그건 편의에 따라서 하면 됩니다. 문자열을 복사해서 처리할 수 있지만 이건 좀 귀찮으니까 그냥 파일로 읽는게 좋습니다. 알고리즘은 특성상 TDD나 유닛테스트와 함께 짜기 좋기 때문에 테스트 환경을 미리 준비해 두는 것도 좋습니다.


C-like

Case #1: 3
Case #2: 2
Case #3: 1
Case #4: 3

아웃풋은 위와 같은 형태가 됩니다. Case #문제번호: 와 같은 형식에 옆에 답을 적어주게 됩니다. 그래서 인풋에서 각 라인의 문제를 읽었을 때 넘버링을 해서 이처럼 출력할 수 있어야 합니다. 아웃풋도 인풋처럼 출력하는 부분을 미리 작성해 두면 시간을 절약할 수 있어서 좋습니다. 출력을 콘솔에 출력해서 파일에 붙혀넣어도 되고 어차피 파일을 제출해야 하기 때문에 파일쓰기로 만들어도 좋습니다.

코드잼 문제의 인풋 버튼

각 문제는 위처럼 Small input와 Large input 2개가 주어집니다. 위 사진은 이미 끝난 라운드의 문제라 2개 다 버튼이 보이지만 원래는 Small input을 통과해야 Large input에 도전할 수 있습니다. 버튼을 누르면 몇분이내에 아웃풋 파일과 소스를 제출해야 하기 때문에 미리 뭔가 하고 눌러보면 페날티만 물게 됩니다. 해커컵 같은 경우는 작년에 재시도가 없어서 한번만 눌러서 떨어졌던 것 같습니다.

그리고 옆에 점수를 잘봐야 합니다. 보통 20점 넘으면 예선 통과 이런 식인데 한 문제의 small과 Large를 다 풀어도 예선 통과 점수가 안되는 경우도 있습니다. 그럴 경우에는 다른 문제의 Small을 하나 더 풀어야 통과할 수 있기 때문에 점수랑 상황을 잘 보고 해야 합니다. 저는 항상 QR에서 떨어지다가 이번에 처음 QR을 통과했었는데 기분인지는 몰라도 QR에서는 A 문제보다 B 문제가 더 쉬웠던 기분이 들었습니다. 꼭 A가 쉬운건 아닙니다.(보통은 점수가 낮으면 쉽다고 추측할 수 있겠죠.)

코드잼 대회에 참가할때 고려해야 할 것들
몇 번 해보니 가장 크고 처음 부딪히는 난관은 문제의 이해입니다. 한국 구글 코드잼이 아닌 이상 당연히 문제는 영어가 나옵니다. 알고리즘 문제는 구어체가 아니기 때문에 이게 은근히 문제를 이해하기 어렵고 결과적으로 정답을 맞춰야하기 때문에 문제의 조건 중 하나만 잘못 이해하더라도 당연히 정답을 맞출 수 없습니다. 여러번 하다보니 좀 나아졌지만 몇년전에 할 때는 문제도 제대로 이해하지 못했서 메일링이나 채팅에서 여럿이 모여서 문제에 대해서 이야기 나누고는 했습니다.

알고리즘은 현업에서 하는 프로그래밍하고는 좀 다르다고 생각합니다. 프로그래밍이란 것은 문제를 해결하는 과정이라고 하긴 하지만 현업에서 프로그래밍 할 때는 사실 알고리즘 성격의 코딩을 할 일은 별로 없습니다. 웹 어플리케이션에서는 대게 더 비즈니스 로직이 뻔한 수준(?)이고 어떤 어려운 알고리즘을 푸는 일 같은 건 별로 없습니다. 알고리즘을 푸는 것은 평소하던 프로그래밍하고 사고하는 방식이 완전히 다른 느낌입니다. 그래서 이런 쪽으로 연습을 많이 해두는 게 좋습니다.(문제는 알고리즘 사이트들에 수없이 있습니다.)

대회 참가를 시작하고 10분 정도가 지나면 제출자가 나타나기 시작합니다. 코드잼은 왼쪽에 탑스코어러와 제출자 통계가 실시간으로 나옵니다. 저는 아직 문제를 다 읽지도 못했는데 이미 다 풀어서 제출까지 하는 사람들이 등장합니다. 여기서 잠시 멘탈 붕괴가 올 수 있는데 참고 풀어야 됩니다. ㅠㅠ 어차피 그런 수준의 사람과 경쟁할 의도는 아니었으니까요. ㅎ

코드를 짤 때 Large input도 고려해서 코딩해야 합니다. 문제를 보면 input 값의 범위가 나오는데 이 경계값까지 고려해서 작성해야 합니다. 보통 small input은 값의 범위가 좀 적지만 large input은 큰 범위의 값들이 많이 나오게 됩니다. 이런 걸 잘 몰랐을 때는 타입을 Int로 하거나 성능을 고려하지 않고 막 짜다가 Large input을 돌려보다가 오류가 나거나 Stackoverflow가 나서 수정하다가 제출 못하는 일도 있었습니다. input 파일을 다운받기 전에 미리 경계값을 넣어도 잘 돌아가는지 테스트해 보아야 합니다. 보통 small input은 여러번 시도할 수 있지만 large input은 한번의 기회 뿐입니다.(large는 보통 결과도 나중에 나옵니다.)

추가로 피곤한 것 중 하나가 output을 제출했을 틀렸다고는 나오지만 어느게 틀렸는지 나오지 않습니다. 문제를 잘 못 이해한 부분이 있거나 로직에 버그가 있을 경우 어디가 틀린건지 알 수 없습니다. 이건 뭐 방법이 없는것 같습니다. 로직을 보면서 다시 고민해서 버그를 찾거나 문제를 손으로 직접 다 풀어봐서 어느 문제가 왜 잘못되었는지 찾아내는 방법밖에 없는 것 같습니다. 저는 항상 여기서 시간을 다 소비합니다. ㅠㅠ

Epilogue
매년 참가는 하고 있는데 사실 이런 대회는 자신이 가장 익숙한 언어를 사용해서 하는 것이 좋습니다. 하지만 저는 뭐 재미나 연습의 의미도 있고 해서 Scala로 풀었습니다. Scala는 제가 익숙한 언어는 아니고 하다보면 API 문서를 보고 찾아서 하거나 문법을 몰라서 헤매는 경우도 많기는 하지만 Scala를 공부하면서 사실 사용할 일은 많지 않기 때문에 Scala 연습도 겸할 겸해서 참여했습니다. Scala를 연습하는게 한 50%정도라면 알고르짐 푸는 연습하는게 30%정도이고 20%정도는 QR통과를 목표로 하고 있었습니다.(QR통과는 한번도 못해봤기 때문에요.)

그런 면에서는 소기의 성과를 달성했습니다. 몇가지 안되긴 하지만 Scala를 쓰면서 손에도 약간 익었고 Scala IDE나 ScalaTest도 사용해 보았습니다. 알고리즘도 아직 부족하지만 약간씩 늘고 있는 것 같긴 하고요. 그럼에서 Round 1에서 떨어지니까 좀 분했습니다. 문제도 잘못 이해하기도 했고 저는 2시간 반이란 시간이 턱없이 부족하기도 했지만 내년을 위해서는 더 정진해야겠습니다. Code Jam 2012 Statistics - Go, Hero!사이트에 가면 코드잼 참가에 대한 여러가지 언어나 나라별 통계를 볼 수 있습니다. 


My Comment..
음.. 내가 이런 코딩 대회 내지는 알고리즘 문제를 풀지는 미지수다.. 햄의 글을 읽으면서도 당췌 먼소린지 이해가 안되고 있으니.. ㅡ;;ㅡ.. 어찌보면 내 업무도 버거운데 왠 알고리즘 문제풀기 라는 생각도 쪼매 들기도 하고.. 그래도 이런곳이 있다는 것을 알고 있는 것은 좋은 것 같다.. 과거에는 마냥 다 관심이 없었는데 요새는 깊이가 없더라도 좀 새로운 것을 보면 오옹~~~ 이러면서 약간의 흥미를 느끼기도 한다.. ㅎㅎ..


2016년 2월 29일 월요일

[DEV]소팅(Sorting) 알고리즘 애니메이션 비교사이트..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

WebAppers에서 "Showing How Each Sorting Algorithm Operates"라는 재미난 사이트 소개가 있어서 공유합니다. 이 사이트는 소팅(Sorting) 알고리즘을 여러가지 상황별로 어떤식으로 동작하고 성능에 어떤 차이가 있는지를 시각적으로 보여주는 사이트입니다.

학생때 정렬에 대해서 배우느라고 고생했던 기억이 납니다. 전산과를 나오셨으면 모두 그런 기억은 있을듯 합니다. 저는 학생때는 워낙 공부를 안해서 더 고생했었는지는 모르겠네요. 소팅하면 버블정렬, 삽입정렬, 머지정렬, 퀵정렬들 많은 알고리즘들이 있고 현업에 와서는 실제로 정렬을 구현한다거나 할일은 별로 없었기는 하지만 그래도 알고 있으면 도움이 되지 않을까 합니다. 시간 지나면 이름만 기억나고 어떤 방식인지가 잘 기억안나기도 하는데 그럴때 도움이 될 듯 합니다.

Sorting Algorithm Animations라는 사이트입니다.

정렬 알고리즘 애니메이션 사이트 화면

사이트의 캡쳐화면입니다. 처음엔 보고 무엇인가 했습니다. 가로축에는 각 정렬 알고리즘들이 있고 세로축에는 데이터가 정렬된 방식이 있습니다. 각 셀을 선택하거나 아니면 비교를 하려면 각 줄에 있는 화살표 아이콘을 클릭하면 각 알고리즘이 정렬되는 알고리즘을 볼 수 있습니다.  상단에서 데이터의 양이나 속도등을 조절할 수 있고 애니메이션을 시작하면 화살표가 왔다갔다 하면서 정렬 알고리즘이 어떤 식으로 정렬을 수행하는지를 볼 수 있고 동시에 진행시키면 어떤 알고리즘이 어떤 상황에 적합한지도 비교해 볼 수 있습니다.

뻔하긴 하지만 이 사이트의 결론은 "There is no algorithm that has all of these properties, and so the choice of sorting algorithm depends on the application."이군요. 상황에 따라 알아서 알고리즘을 써라. 군요.. ㅎ

정렬 공부하실 분은 참고하시면 좋을 듯 하네요.

2016년 2월 18일 목요일

[Book] Short Coding - 알고리즘 트레이닝으로 배우는 코드 단축기법..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

Short Coding - 8점
Ozy 지음, 서수환 옮김/한빛미디어



제목과 표지디자인이 인상깊어서 구입을 했다. 그리고 어떤 책을 볼까 하다가 집어 들었다.

내 개발 경험이 아주 얕기는 하지만 그래도 주워들은건 좀 있는데  이 책의 저자가 얘기하는 코딩의 세계는 아주특이하고 나로써는 처음 보는 것이었다. 이 책은 내가 보통의 기대하던 알고리즘을 이용한 코드단축이라던지 리팩토링 기법, 퍼포먼스 향상을 위한 튜닝 같은 부분에 대한 내용이 전혀 아니었다. 솔직히 읽기 전에는 그런 부분을 기대했었다.



여기서 말하는 숏코딩은 말 그대로 숏코딩이었다. 어떤 문제를 해결하기 위해서 소스를 얼마나 짧게 짜는가이다.  어떤 알고리즘적인 문제를 해결하는데 그냥 해결만 하는 것이 아니라 계속 고드단축을 시도해서 단축할 수 있는 데까지 단축하는 것이다. 여기서는 보통 PKU 온라인 심사(POJ)라는 국제 대학 프로그래밍 컨테스트에 도전하는 학생들을 위해서 만들어진 여러문제에 대해 각종 언어로 컴파일하고 실행해 볼 수 있는 사이트를 이용하고 있다.

어쨌든 이럭게 숏코딩을 하다보니 상당히 변태(?)적이 코드가 나온다. 컴파일러의 특징을 이용해서 include문을 아예 없애버린다던지 for문에 조건을 다 안준다던지, 변수선언에서 한바이트를 줄이기 위해 전역으로 선언한다든지 하는..... 완성된 코드를 보면 이게 코드인지 암호인지 모를정도이다... 보통 얘기하는 가독성, 정형화된 문법은 여기서 신경쓰는 바가 아니다.

이런 도전을 한다는 것이 나에게는 꽤나 흥미로왔다. 이런 세계도 있구나 하는..... 이책에서는 대부분의 소스를 C로 작성하고 있다. 대학때 잠시 배운 C실력으로 이해하기는 무리라고 생각했으나 후반부에 자바도 한색션정도 나오는데 역시 이해를 못했다. (ㅡ..ㅡ)


지은이도 얘기하듯이 여기서 배운 테크닉을 써먹을 수 있냐 하면 그렇지는 않다.  하지만 숏코딩을 하려면 알고리즘과 언어에 대한 충분한 이해가 필요하고 이런 도전을 하면서 지식은 더욱 늘어나고 가독성을 고려하지 않은 복잡한 소스를 보면서 독해력도 늘어갈 수 있다. 어려운 문제에 도전해서 내공을 높인다는 것인데 확실히 이걸하려면 보통 실력으로는 쉽지 않겠다는 생각은 든다.

처음 코딩을 하면 이것저것 해보고 싶은데 뭘 해야할지 막막할 때가 상당히 많은데 이럴 때 POJ의 알고리즘들을 (숏코딩은 아니더라도) 시도해 보면 공부에 큰 도움이 될꺼라고 생각한다. 당연히 쉬운 문제들은 아니다.

원래대로라면 문제하나하나를 다 같이 고민하고 짜보면서 해야 진짜일텐데 일단 C는 내 분야가 아니기도 했고 그렇게 읽으면 책읽는 속도가 너무 느려지기 때문에 속독하듯이 가볍게 본 편이다. 나에게 큰 도움을 준 책은 아니지만 상당히 신선한 충격을 주어서 별 4개