- 순열(Permutation) - 순서가 중요
- 조합(Combination) - 순서 중요 X
- 소수 판별
- 최장 증가 부분 수열 - O(N^2)에 구하는 증가하는 부분 수열의 최대 길이
- 투 포인터(Two-Pointer) - 연속된 구간의 합이나 정보
- 구간 합(Prefix Sum) - a부터 b까지 합
- 최대공약수(GCD), 최소공배수(LCM) - 유클리드 호제법으로 O(logN)에 구하기
- 서로소 집합 알고리즘
- 사이클 판별 - 모든 합연산(union) 이후 루트 노드가 모두 같으면 사이클
- 크루스칼 알고리즘 - 모든 노드를 연결하는 최소 비용 구하기
- 간선의 비용으로 정렬한 다음 사이클이 생기지 않으면 서로 연결
- 위상 정렬 - 선후 관계를 가지는 순서로 정렬
- ex) 고급 알고리즘의 선행 과목은 자료구조와 알고리즘
// 1. 하나의 값을 입력받을 때
const fs = require('fs');
const input = fs.readFileSync("/dev/stdin").toString().trim();
// 2. 공백으로 구분된 한 줄의 값들을 입력받을 때
const fs = require('fs');
const input = fs.readFileSync("/dev/stdin").toString().trim().split(" ");
// 3. 여러 줄의 값들을 입력받을 때
const fs = require('fs');
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
// 4. 첫 번째 줄에 자연수 n을 입력받고, 그 다음줄에 공백으로 구분된 n개의 값들을 입력받을 때
const fs = require('fs');
const [n, ...arr] = fs.readFileSync("/dev/stdin").toString().trim().split(/\s/);
// 5. 첫 번째 줄에 자연수 n을 입력받고, 그 다음줄부터 n개의 줄에 걸쳐 한 줄에 하나의 값을 입력받을 때
const fs = require('fs');
const [n, ...arr] = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
// 6. 하나의 값 또는 공백으로 구분된 여러 값들을 여러 줄에 걸쳐 뒤죽박죽 섞여서 입력받을 때
ex) n 입력 - 공백으로 구분된 n개의 값 입력 - m 입력 - 여러 줄에 걸쳐 m개의 값 입력
const fs = require('fs');
const input = fs.readFileSync("/dev/stdin").toString().trim().split(/\s/);
const n = input[0];
const n_arr = input.slice(1, n+1);
const [m, ...m_arr] = input.slice(n+1);
1번 내용에서 이것저것 변형시키면 된다.