분류 전체보기 300

[백준] 14003번 / 플래티넘5 / 가장 긴 증가하는 부분 수열 5 / Node.js

문제 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다. 입력 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (-1,000,000,000 ≤ Ai ≤ 1,000,000,000) 출력 첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다. 둘째 줄에는 정답이 될 수 있는 가장 긴 증가하는 부분 수열을 출력한다. 예제 입력 6 10 20 10 30 20 50 예제 출력 4 10 20 30 50..

[Git] 브랜치 관리

Achievement Goals Git 으로 프로젝트를 관리하며 브랜치를 생성, 전환, 병합할 수 있다. 브랜치란? 다수의 인원이 독립적으로 작업을 진행하기 위한 개념이다. 즉, 다수의 인원이 협업할 때 한 소스 코드에서 동시에 다른 작업을 할 수 있게 해준다. 한 소스코드에서 동시에 다양한 작업을 할 수 있다. 소스코드의 한 시점과 동일한 상태를 만들고, 브랜치를 넘나들며 작업을 수행할 수 있다. 각각의 브랜치는 병합하지 않는 이상 다른 브랜치에 영향을 주지 않는 독립적인 브랜치이다. 브랜치를 나누는 이유 여러 명이 독립적으로 다양한 작업을 한 후 다른 브랜치 또는 메인 브랜치로 병합하는데, 이 과정에서 독립적인 작업이 작업 단위가 되어 어떠한 문제가 발생했을 때 문제의 원인을 쉽게 파악할 수 있다. ..

[백준] 12015번 / 골드2 / 가장 긴 증가하는 부분 수열 2 / Node.js

문제 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다. 입력 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000,000) 출력 첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다. 예제 입력 6 10 20 10 30 20 50 예제 출력 4 소스 코드 let input = require('fs').readFileSync('/dev/stdin&..

[백준] 9251번 / 골드5 / LCS / Node.js

문제 LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다. 입력 첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 대문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다. 출력 첫째 줄에 입력으로 주어진 두 문자열의 LCS의 길이를 출력한다. 예제 입력 ACAYKP CAPCAK 예제 출력 4 소스 코드 const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n') con..

[컴퓨터 공학 기초] 운영체제, 프로세스, 스레드

운영체제 (operating system) 사용자에게 편의성 제공을 목적으로 컴퓨터 하드웨어를 관리하는 시스템 소프트웨어이다. 사용자는 응용 프로그램을 이용해 다양한 작업을 하는 것이 목적이고, 운영체제는 응용 프로그램이 하드웨어에게 일을 시킬 수 있도록 돕는다. 즉, 운영체제는 하드웨어의 시스템 자원을 관리하는 주체이다. 응용 프로그램 운영체제를 통해 컴퓨터에게 일을 시키는 것 응용 프로그램은 컴퓨터를 조작할 수 있는 권한을 처음부터 가지고 있는게 아니기 때문에 응용 프로그램이 컴퓨터에게 일을 시키기 위해서는 운영체제를 통해 컴퓨터를 조작할 수 있는 권한을 부여 받아야 한다. 따라서, 운영체제는 응용 프로그램과 소통하기 위해 인터페이스(API)를 제공한다. 응용 프로그램이 시스템 자원을 사용할 수 있도..

[컴퓨터 공학 기초] 문자열

ASCII (아스키 코드) 미국정보교환표준부호(American Standard Code for Information Interchange), 또는 줄여서 ASCII(아스키)는 영문 알파벳을 사용하는 대표적인 문자 인코딩이다. 아스키는 컴퓨터와 통신 장비를 비롯한 문자를 사용하는 많은 장치에서 사용되며, 대부분의 문자 인코딩이 아스키에 기초를 두고 있다. 아스키는 7비트 인코딩으로, 33개의 출력 불가능한 제어 문자들과 공백을 비롯한 95개의 출력 가능한 문자들로 총128개로 이루어진다. 제어 문자들은 역사적인 이유로 남아 있으며 대부분은 더 이상 사용되지 않는다. 출력 가능한 문자들은 52개의 영문 알파벳 대소문자와, 10개의 숫자, 32개의 특수 문자, 그리고 하나의 공백 문자로 이루어진다. 유니코드 ..

[인증/보안] HTTPS, Hashing, Salt, Cookie, Session

HTTPS HTTPS는 HTTP 요청을 SSL 혹은 TLS라는 알고리즘을 이용해, HTTP 통신에서 주고받는 데이터를 암호화하여 전송하는 방법이다. HTTPS - 특징 HTTPS 프로토콜은 SSL 혹은 TLS이라는 암호화 기반 인터넷 보안 프로토콜을 사용해 주고받는 데이터를 암호화하기 때문에 HTTP보다 안전한 방법이며, SSL과 TLS은 인증서가 있는 웹사이트만 실행할 수 있기 때문에 인증서를 통해 데이터 제공자의 신원을 보장 받고 도메인 비교로 공격을 방지할 수 있다. 인증서는 CA(인증 기관)에서 발행한다. 1. SSL 또는 TLS를 사용해 주고받는 데이터를 암호화한다. => SSL과 TLS는 인증서를 발급받아야만 사용가능하다. 2. 인증서는 CA라는 인증기관에서 발행하기 때문에 브라우저가 응답과 ..

[자바스크립트] 이벤트 리스너 사용 시 this 바인딩 문제

우테코 지하철 노선도 미션 코드 작성 중에 this 바인딩 문제를 발견했다. 평소 'this 바인딩은 쓸 일이 별로 없지 않을까?'라고 생각하며 this 바인딩에 대해 깊게 생각해보지 않았는데 문제를 직접 겪어보니 상당히 당혹스러웠다. 평소에 짜던 코드와 전혀 이질감을 못 느꼈는데 계속 오류가 나서 한참을 헤맸다. class StationManager { constructor() { this.station = []; this.newListId = 1; this.stationList = document.querySelector('#station-add-list'); this.stationNameInput = document.querySelector('#station-na..

[알고리즘] 병합 정렬(merge sort)

병합 정렬(merge sort) 비교 기반 정렬 알고리즘. 안정 정렬에 속하며, 분할 정복 알고리즘의 하나이다. 소개 (오름차순 정렬 기준) 1. 정렬되지 않은 리스트를 절반씩 잘라 두 부분의 리스트로 나눈다. => 분할(Divide) 2. 1번 과정을 부분 리스트의 길이가 1이하일 때 까지 반복한다. 3. 각 부분 리스트를 재귀적으로 정렬(정복, Conquer)하며 합병(결합, Merge)한다. 4. 모든 부분 리스트가 하나의 정렬된 리스트로 합병될 때 까지 3번 과정을 반복한다. 코드 const merge = (arr1, arr2) => { const mergeArr = []; const size = arr1.length + arr2.length; let left = 0; let right = 0; ..

[알고리즘] 퀵 정렬(quick sort)

퀵 정렬(quick sort) 분할 정복 알고리즘의 하나로, 평균적으로 매우 빠른 수행 속도를 자랑하는 정렬 방법이다. 다른 원소와의 비교만으로 정렬을 수행하는 비교 정렬에 속한다. 원소들 중에 같은 값이 있는 경우 같은 값들의 정렬 이후 순서가 초기 순서와 달라질 수 있어 불안정 정렬에 속한다. 소개 (오름차순 정렬 기준) 1. 리스트에서 하나의 원소를 고른다. 이 원소를 피벗이라 한다.(보통 가장 작은 인덱스의 요소) 2. 피벗 앞에는 피벗보다 작은 값의 요소를, 피벗 뒤에는 피벗보다 큰 값의 원소가 오도록 리스트를 둘로 나눈다. 이렇게 둘로 나누는 것을 분할이라고 한다. 3. 분할된 두 개의 작은 리스트는 재귀적으로 1~2번 과정을 반복한다. 재귀는 리스트의 크기가 0이나 1이 될 때까지 반복한다...