일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- typescript
- 알고리즘
- 레벨 1
- 프로그래머스
- TCP
- dfs
- 수학
- ip
- 타입스크립트
- 소켓
- 자바스크립트
- 쉬운 문제
- BFS
- dp
- 가천대
- HTTP
- type challenge
- 백준
- 타입 챌린지
- Node.js
- socket
- javascript
- HTTP 완벽 가이드
- 프로그래머스 레벨 2
- 문자열
- 크롤링
- Crawling
- Nestjs
- 그래프
- Algorithm
- Today
- Total
목록프로그래밍 (478)
kakasoo
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/mH909/btrvRzEsftF/kk0xypfdhFbAFUpKaLuKik/img.png)
Express의 구조 ( Router, Route, Layer ) 잠깐 쉬어가는 느낌으로, 그림을 가지고 설명합니다. 플로우 차트 기호 같은 걸 전혀 모르셔도 좋습니다. ( 애초에 프로그램 시작 말고는 그걸 따르지도 않았습니다. ) 지금 생각하니 괜히 코드를 넣었나 싶네요. 처음에 프로그램이 시작하면 express() 함수는 application을 만듭니다. application은 생성됨과 동시에 HTTP의 각 메서드들에 handler 함수를 등록하는 함수를 만듭니다. 이후 app.get, app.post 등과 같이 첫 번째 파라미터로 path를, 두 번째 파라미터로 handler 함수를 전달해주면 아까 생성된 함수들이 동작합니다. 앞에 get, post 등 HTTP 메서드 이름으로 함수를 실행합니다. ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/F8b3x/btrvRzxGb2C/kNdnIr7Md1wDn1x0aBUjek/img.png)
Router의 필요성 application은 어쩌면 Router라고 봐도 될지 모르겠습니다. 갑자기 이런 말을 하는 게 의아할 수 있겠습니다만, 사실 앞서 구현한 코드에는 Application 하나만이 존재할 뿐, 다른 Router는 존재하지 않습니다. "그래도 사용하는 데에는 아무런 문제가 없지 않았나요?" 그렇습니다. 아직 path 기능이 완벽하진 않고 ( 지금은 완벽하게 매칭되어야만 하니깐요. ), 그 외에도 추가해야 할 게 산더미처럼 많지만, 어쨌든 원하는대로 동작하는 것을 볼 수 있긴 했습니다. 그렇지만 이렇게 되면 결국 한 덩어리로 만드는 것입니다. 당연히 코드가 길어질수록 힘들어질 것입니다. 앞서 app이라는 함수에 if문으로 분기 처리하는 게 지저분했기 때문에 분리한 거잖아요? 결국 같은 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/rnNzV/btrvSB2K02V/pBeTjYH70UEdTKUJ1b65O0/img.png)
URL에 따라 다르게 동작하기 메서드에 대한 고민은 일단 접어둡시다. 메서드는 오직 GET 하나만 가능한 서버를 만들 겁니다. 일단 편의 상 경로는 아래처럼 세 가지가 있다고 가정하고 해봅시다. / /cats /dogs 세 가지 경로에 대해서 분기를 한다고 하면 이렇게도 가능할 것입니다. const TExpress = () => (req, res) => { console.log("Current URL is : ", req.url); if (req.url === "/") { res.setHeader("Content-Type", "text/plain"); res.end("root."); } else if (req.url === "/cats") { res.setHeader("Content-Type", "tex..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/9yw0o/btrvSACMmX4/U4hdelOsKsnt7haOJKrfC1/img.png)
나는 express를 알고 있을까? const http = require("http"); const app = require("./app.js"); const server = http.createServer(app); server.listen(PORT, () => console.log("Server is opened.")); 일반적으로 node.js와 Express.js를 사용해 서버를 만든다면 위의 코드는 공통으로 들어갈 것입니다. 그렇기 때문에 위 코드를 이해하는 데에는 큰 어려움이 없을 것 같습니다. 그런데 공부를 하면서 헷갈리는 부분이 참 많았죠. 하지만 당장 서버를 만드는 데에 필요한 것 같지는 않아 방치하다 이제야 그 고민을 마주합니다. Framework는 뭐지? Server와 Express의..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/QM6zb/btq4HOQok0p/sAcDKvrie292tfdMt8jGQ1/img.png)
const readline = require("readline"); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); rl.on("line", (line) => { const [E, S, M] = line.split(" ").map(Number); let e = 1; let s = 1; let m = 1; let count = 1; while (true) { if (E === e && S === s && M === m) { console.log(count); return; } e++; s++; m++; count++; if (e > 15) { e = 1; } if (s > 28) { s = 1; }..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/byfyz9/btq4Jf01aCS/KR3jb5GVjOmKePAdriszYK/img.png)
귀찮아서 때려 박듯이 풀었다. const readline = require("readline"); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); const people = []; rl.on("line", (line) => { people.push(line); if (people.length === 9) { main(people); } }); /** * * @param {string[]} people */ const main = (people) => { const heights = people.map(Number).sort((a, b) => a - b); const sum = heights.red..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/Gv95o/btq4IDTvofR/UWIMzkJQuwfsUxivbeEhN1/img.png)
const readline = require("readline"); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); rl.on("line", (line) => { let [a, b, c] = line.split(" ").map(BigInt); const pow = (a, b, c) => { if (b == 0) { return BigInt(1); } const temp = pow(a, BigInt(parseInt(b / BigInt(2))), c); if (b % BigInt(2)) { return (((temp * temp) % c) * a) % c; } else { return (temp * ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/9ADLX/btq2KxaOD1A/BRpKZdcHIradxtuWriaWl0/img.png)
const readline = require("readline"); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); rl.on("line", (line) => { main(line); }).on("close", () => process.exit()); /** * * @param {string} line */ const main = (line) => { const [N, K] = line.split(" ").map(Number); const arr = new Array(N).fill(0).map((el, i) => i + 1); let answer = "
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/5phTw/btq2CEuS07U/ywWMOLhQLMgk72z6Hk3zdK/img.png)
const readline = require("readline"); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); let N = 0; const input = []; rl.on("line", (line) => { if (!N) { N = Number(line); } else { input.push(line); if (input.length === N - 1) { main(); } } }); const main = () => { const graph = []; const answer = []; for (let i = 1; i { const [from, to] = edge.split(" "); gr..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/eenszx/btq2CE2Wofp/kfVbHHw3VFqOT39L2yfhy1/img.png)
const readline = require("readline"); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); rl.on("line", (line) => { main(line); }); /** * * @param {string} line */ const main = (line) => { let small = 0; let big = 0; let num = 0; let space = 0; for (let i = 0; i < line.length; i++) { const cur = line[i]; if (!isNaN(cur - 0)) { if (cur === " ") { space++; } els..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cOPFa3/btq2CFfUhrM/uPWw1jK6sRK1lLUURtUxP0/img.png)
const readline = require("readline"); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); rl.on("line", (line) => { let answer = ""; for (let i = 0; i < line.length; i++) { answer += line[i]; if (answer.length === 10) { console.log(answer); answer = ""; } } console.log(answer); });
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/67Lgp/btq2zfhObYN/rsYBBpHPsVXWY96k1pUpq0/img.png)
시간 초과를 해결했더니, 공간 복잡도가 높아지는 문제가 있었다. 일반적으로, dfs로 해서 해결될만한 문제 같은데, 35% 이상을 넘어가면 런타임 에러가 발생했다. ( 중간에 CannotFindModule은 자동완성 때문에 그러하다. ) 내 개인적인 생각으로는, 스택 영역이 고갈되었기 때문이다. 사실, StackSizeExceeded라고 써있으니 당연한 거 아닌가, 생각할 수 있겠지만, 그래도 생각해볼 부분이 나름 있다. 자바스크립트의 변수는 다른 언어들보다 좀 크다. 숫자의 경우의 8바이트, 기본적으로 모든 숫자가 double이기 때문이다. 그러니깐 잘 짜려고 노력해도 남들보다 변수를 2배 이상 가지고 있으니, 똑같은 함수여도 가끔씩 stack이 고갈된다. 따라서 정적인 영역 ( 데이터 영역 )으로 조..