전체 글
허준이 교수의 졸업 축사 전문
안녕하세요, 07년도 여름에 졸업한 수학자 허준이입니다. 우리가 팔십 년을 건강하게 산다고 가정하면 약 삼만일을 사는 셈인데, 우리 직관이 다루기엔 제법 큰 수입니다. 저는 대략 그 절반을 지나 보냈고, 여러분 대부분은 약 삼 분의 일을 지나 보냈습니다. 혹시 그중 며칠을 기억하고 있는지 세어 본 적 있으신가요? 쉼 없이 들이쉬고 내쉬는 우리가 오랫동안 잡고 있을 날들은 삼만의 아주 일부입니다. 먼 옛날의 나와, 지금 여기의 나와, 먼 훗날의 나라는 세 명의 완벽히 낯선 사람들을 이런 날들이 엉성하게 이어 주고 있습니다. 마무리 짓고 새롭게 시작하는 오늘 졸업식이 그런 날 중 하나일 수 있겠다는 생각이 듭니다. 그런 하루를 여러분과 공유할 수 있어서 무척 기쁩니다. 학위수여식에 참석할 때 감수해야 할 위..
계층화 아키텍처 (Layered Architecture) / MVC Pattern / Node.js에서의 적용
계층화 아키텍처란 "좋은 코드(협업 가능한 코드)를 작성하기 위해 특정 역할과 관심사로 코드를 모듈화 하는 것" 그렇다면 좋은 코드란 무엇일까 확장성(extensibility) - 시스템의 규모가 커질 경우를 대비할 수 있어야 한다. 재사용성(reusability) - 반복되는 로직을 함수로 분리하고, 설계한 구조를 재사용 할 수 있어야 한다. 유지-보수 가능성(maintability) - 여러 로직이 뒤엉키면 코드는 유지 보수가 어려워진다. 가독성(readability) - 어려운 로직 일수록 더 가독성이 높아야 한다. 어려운 로직을 쉽고 간단하게 구현하는 것이 좋은 코드다. 프로젝트의 구조 또한 한 눈에 그려져야 한다. 테스트 가능성(testability) - 테스트를 하기 쉬운 코드는 모듈화가 잘 ..
[백준 2587] 대표값2 (Node.js)
https://www.acmicpc.net/problem/2587 2587번: 대표값2 어떤 수들이 있을 때, 그 수들을 대표하는 값으로 가장 흔하게 쓰이는 것은 평균이다. 평균은 주어진 모든 수의 합을 수의 개수로 나눈 것이다. 예를 들어 10, 40, 30, 60, 30의 평균은 (10 + 40 + 30 + 60 + www.acmicpc.net let i = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n').sort((a,b)=>(a-b)).map(Number) console.log(`${i.reduce((a,c)=>a+c)/5}\n${i[2]}`) 숏코딩은 재미로 보라고 하지만.. 처음으로 1등하여 무척 감격스럽습니다.. ㅜ
[백준 2738] 행렬 덧셈 (Node.js) / 자바스크립트 행렬끼리 덧셈
https://www.acmicpc.net/problem/2738 2738번: 행렬 덧셈 첫째 줄에 행렬의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 차례대로 주어진다. 이어서 N개의 줄에 행렬 B의 원소 M개가 차례대로 주어진다. N과 M은 100보다 작거나 같 www.acmicpc.net let input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n') let [N,M] = input[0].split(' ').map(Number); for(let i=1; i x + b[y]).join(' ')) //첫번째+두번째 행렬의 합 (map 이용) }; 숏코딩 첨으로 순위권에 들었다..
RESTful API 쉽게 이해하기
REST API란 REST는 REpresentational State Transfer의 줄임말이다. “State”는 웹 애플리케이션 의 상태를 의미하며, “Transfer”는 이 상태의 전송을 의미한다. 웹서비스에서 전달하려는 자원의 상태 표현 방식이라고 이해하면 쉽다. REST API는 2000년도에 로이 필딩 (Roy Fielding)의 박사학위 논문에서 최초로 소개되었다. 로이 필딩은 HTTP의 주요 저자 중 한 사람으로 그 당시 웹(HTTP) 설계의 우수성에 비해 제대로 사용되어지지 못하는 모습에 안타까워하며 웹의 장점을 최대한 활용할 수 있는 아키텍처로써 REST를 발표했다고 한다. - REST의 규칙을 지키면서 만든 API를 REST API 혹은 RESTful API라고 부른다. REST AP..
[Javascript] require 와 import 비교
공통점 두 가지 모두 외부의 파일이나 라이브러리 등 모듈을 불러오는 목적으로 사용한다. require - exports Node.js에서 사용되고 있는 CommonJS 키워드이고 Ruby 의 언어 스타일과 비슷하다. import - export ES6(ES2015)에서 새로 도입된 키워드로서 Java나 Python 언어 방식과 비슷하다. 차이점 1. 문법구조 아래 2줄의 코드는 기본적으로 외부 모듈의 코드를 불러오는 동일한 작업을 수행하고 있지만 문법 구조가 다르다. /* CommonJS */ const name = require('./module.js'); /* ES6 */ import name from './module.js' require()는 CommonJS를 사용하는 node.js문이지만 imp..
[OS] 메모리 계층 구조 쉽게 이해하기
메모리 계층 구조란 무엇인가 (Memory Hierachy) 메모리를 필요에 따라 여러가지 종류로 나누는 것 => Why?? CPU가 메모리에 더 빨리 접근 가능해짐 컴퓨터 설계에 있어 서로 다른 여러 종류의 메모리 저장 장치를 함께 사용하여 최적의 효율을 낼 수 있게 하는 것 상황에 맞게 여러 저장 장치를 각각 사용하는 설계 => 컴퓨터 성능이 좋아짐 1. 레지스터(Register) CPU가 요청을 처리하는 데 필요한 데이터를 일시적으로 저장하는 기억장치 CPU는 자체적으로 데이터를 저장할 방법이 없으므로 메모리로 직접 데이터를 전송할 수 없음 → 연산을 위해서 반드시 레지스터를 거쳐야 하며, 이를 위해 레지스터는 특정 주소를 가리키거나 값을 읽어올 수 있음 프로세서에 위치한 고속 메모리로, 프로세스가..
[알고리즘] 시간 복잡도와 Big-O
알고리즘이란 어떤 목적을 달성하거나 결과물을 만들어내기 위해 거쳐야 하는 일련의 과정들을 의미 여러가지 상황에 따른 알고리즘은 모두 다르다. 따라서 시간복잡도가 가장 낮은 알고리즘을 선택하여 사용 효율적인 알고리즘을 구현한다는 것은 바꾸어 말해 입력값이 커짐에 따라 증가하는 시간의 비율을 최소화한 알고리즘을 구성하는 것 시간 복잡도(Time Complexity) 알고리즘의 수행 시간을 분석할 때 시간 복잡도를 사용 최상의 경우 : 오메가 표기법 (Big-Ω Notation) (하한 점근) 평균의 경우 : 세타 표기법 (Big-θ Notation) (평균) 최악의 경우 : 빅오 표기법 (Big-O Notation) (상한 점근) => 시간 복잡도는 일반적으로 빅오 표기법으로 나타냄. 평균인 세타 표기를 하..
Object Oriented Programming 객체 지향 프로그래밍
객체 지향 프로그래밍이란 컴퓨터 프로그래밍의 패러다임 중 하나. 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메세지를 주고받고, 데이터를 처리할 수 있다. 즉, 프로그래밍에서 필요한 데이터를 추상화 시켜 상태와 행위를 가진 객체로 만들고, 객체들간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다. 처음 개발을 시작하는 사람들에겐 난해한 개념이지만. 명령어(코드)들을 하나의 부품처럼 구분한다고 생각하면 쉽다. 각각의 부품들은 서로 연결되어 있으며 서로의 기능들을 주고받고 결국 그것들이 모여 하나의 프로그래밍이 완성된다. 객체 지향 프로그래밍의 장단점 장점 클래스 단위로 모듈화시켜서 개발하기 때문에 업..
[백준 2941] 크로아티아 알파벳 (Node.js)
2941번: 크로아티아 알파벳 예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s= ž z= www.acmicpc.net 문제 해결만을 우선적으로 생각하다보니 코드가 그야말로 단순무식해졌다. 숏코딩에 고수들의 접근 방식을 보며,, 감탄했다. 다들 이렇게 쉬운 방법으로 푸는구나. 고수들도.. 처음부터 잘 하지는 않았을 거라는 생각을 가지며.. 오늘도 배운다는 생각으로.. 아래는 내가 처음으로 작성했던 코드 const input = require('fs').readFileSync('/dev/stdin').toString().trim().split(..