'2015/05'에 해당되는 글 2건

  1. 2015.05.09 node.js의 중요한 특징
  2. 2015.05.01 2591_숫자카드

노드js는 자바스크립트의 발전 이래 범용 자바스크립트인 Common JS 1.0 명세를 따르고 있습니다. 

node.js의 특징이자 강력한 장점에 대해서 차근차근 설명해나가고자 합니다. 

이전에는 백엔드 프로그래밍과 프로트엔드 프로그래밍에서의 언어가 확실히 분리되어 

서버 프로그래밍에는 java, c, php, perl, ruby와 같은 언어들이 사용되었고(물론 지금도 광범위하게 사용되고 있다)

프론트엔드 프로그래밍에는 UI를 구성시키는 html과 css그리고 동적으로 동작하게 하는 javascript가 사용되었다.

프론트엔드를 다루었던 javascript는 프로토타입(prototype : 원형)형 객체지향 프로그램이을 따르고 있었고, 스크립트 언어이었기에 속도가 느려서 백엔드에서 로직을 구동하는 것은 어려운 언어였다. 

하지만 v8에서 기본적인 javascript들이 미리 컴파일되어 작동시키는 구조를 갖게 됨으로써 엄청 속도가 향상되게 되었다. 

이러한 javascript의 발전으로 nodejs라는 백엔드 서버 기술로써 javascript를 사용하는 nodejs가 탄생 할 수 있게 되었다.


** Common JS 란 무엇인가?

nodejs는 Common JS란 스펙을 따르고 있는데 그렇다면 이 Common JS란 무엇인가? 

node.js를 작업하다보면 exports, module, require 등의 클라이언트 자바스크립트에서 사용하지 않는 지시어를 사용하게 되는데 이 것이 Common JS의 스펙에 명세된 지시어이기 때문이다.


** Node.js 이전에 helma, appjet, jaxer 등등 역시 모두 javascript로 서버 사이드를 작업을 할 수 있게 만든 것이었는데 유독 Node.js 만 성공한 이유는 무엇일까?

(1) 자바스크립트에 대한 인식 변화(역시 뛰어난 자들이 자바스크립트 진영에 뛰어든 효과는 엄청나다고 생각한다)

(2) javascript engine의 성능향상(v8엔진은 c++로 만들어져있고 성능이 매우 우수하다)

(3) Blocking I/O를 제거했다!

이렇게 정리 할 수 있겠다. 


nodejs를 두 단어로 표현한다면?

Event Driven !, Non-Blocking IO !


A. 싱글 스레드의 의미에서 설명하자면 

점원이 한명이고 손님이 5명, 그리고 그 다음 손님이 나라면 

내가 업무를 처리 할 수 있는 것은 점원이 5명의 손님의 업무를 처리한 채로 6번째 순서가 된다. 

엄청난 시간 낭비가 아닐 수 없다. 한국 사람들이 그렇듯이 컴퓨터 역시 이렇게 불필요하게 기다리는 것은 정말 싫어한다.


B. 멀티 스레드의 의미에 대해서 설명하자면

점원이 5명이고 손님이 5명, 여섯 번째 손님인 나는 1명만 기다리면 된다.


C. 이벤트 드리븐 방식에 대해서 설명하자면

점원은 한 명 손님은 여러명이다. 하지만 점원이 업무를 처리하는 동안 나는 저기 다른데 가서 일을 처리하고 있으면 된다.

결과적으로 내가 기다리는 시간 0시간이다. 다른 일을 할 수 있게 되었다는 것은 엄청나다. 

이와 같은 예는 이벤트 드리븐 방식과 논 블록킹을 설명하는데 아주 적합한 예라고 할 수 있겠다.

 

출처는 http://blog.secmem.org/491



Posted by slender ankles
,

정말 dp로 문제를 풀어나가는데 어려움을 느낀다.

시험이 끝나고 dp문제를 많이 풀어봐야겠다. dp를 잘 풀어야 문제해결능력이 높다고 할 수 있다는 것을 깨달았다. 


이 문제는 dp에 대한 풀이경험이 많다면 충분히 풀 수 있는 문제였다.

우선 문제에 대해서 정리하자면

1~34까지의 숫자가 적힌 카드가 있다. 

어느 한 숫자들 문제에서 보면 27123을 이 숫자카드를 나열하여 만들 수 있는 경우의 수를 구하는 문제였다. 

처음에는 dp인지도 모르고 백트래킹으로 풀어냈다. 

처음에 2인 카드를 놓는 경우에 그 다음 카드부터 7 또는 27카드를 놓을 수 있는 경우의 수와 함께

분기시켜며 결국 답을 구해냈다. 하지만 시간초과 ㅜㅜ 

이 문제는 찾아보니 dp문제였다. 

1~40자리의 수 이므로 백트레킹으로는 아무리 줄이더라도 정말 어마어마한 숫자가 나온다. 

그래도 1자리와 2자리 조건이 있으므로 충분히 시간 안에 답이 나올 수 있을 것이라 생각했는데 

아니었다. 


그 이후로는 도저히 방법이 생각 안나 막혔는데, 도움을 얻고 풀어냈다 생각의 전환이 필요했다. 

27123을 나열할 때 

2 -> 27 , 1 -> 12 -> 123 이 피보나치 수열의 형태로 경우의 수를 가진다는 것을 알았다. 

0으로 끊키거나, 2자리수가 34가 넘는 수는 피보나치의 형태를 깨뜨리고 다시 시작하게 되었다. 

예전에 풀었던 자리배치 dp문제와 완벽히 비슷한 문제였는데, 풀어내지 못 해서 아쉽다. 

자리배치 문제는 고정석을 경계로 피보나치의 값을 가지는데 이 경우는 10, 20, 30과 34를 넘는 수에서 피보나치가 끊키고

약간의 조건만 걸어주면 되는 문제였다. 

경우의 수 문제에서는 시간 안에 풀 수 없다면 피보나치를 한 번 생각해보자!!


'알고리즘문제풀이' 카테고리의 다른 글

더블릿_worldcup  (0) 2015.08.20
더블릿_rprime  (0) 2015.08.20
2564_경비원  (0) 2015.04.30
2565_전깃줄  (0) 2015.04.29
2505_두번뒤집기  (0) 2015.04.28
Posted by slender ankles
,