반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
Tags
- BFS
- Node.js
- 알고리즘
- 백준
- type challenge
- HTTP
- socket
- 레벨 1
- Crawling
- 자바스크립트
- 타입 챌린지
- 소켓
- 타입스크립트
- 쉬운 문제
- 프로그래머스
- javascript
- 프로그래머스 레벨 2
- typescript
- HTTP 완벽 가이드
- 수학
- Algorithm
- dp
- 그래프
- Nestjs
- ip
- 문자열
- 크롤링
- 가천대
- dfs
- TCP
Archives
- Today
- Total
kakasoo
[node.js] 외판원 순회2 ( 백준 10971번 ) 본문
반응형
코드 중간 주석 부분을 확인할 것
// 백준 10971번 외판원 순회2를 풀었습니다.
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const input = [];
const permutations = function* (elements) {
if (elements.length === 1) {
yield elements;
} else {
const [first, ...rest] = elements;
for (const a of permutations(rest)) {
for (let i = 0; i < elements.length; i++) {
const start = a.slice(0, i);
const ended = a.slice(i);
yield [...start, first, ...ended];
}
}
}
};
rl.on("line", (line) => {
input.push(line);
}).on("close", () => {
const map = input.slice(1).map((el) => el.split(" ").map(Number));
const cities = new Array(map.length).fill(0).map((el, i) => i);
/* 아래 코드는 메모리 초과가 발생했기 때문에, 제너레이터로 하나씩 처리하게 고친다.
const cases = [...permutations(cities)];
let minValue = 987654321;
cases.forEach((el) => {
let sum = 0;
for (let i = 0; i < el.length; i++) {
const starting = el[i % el.length];
const arrival = el[(i + 1) % el.length];
const distance = map[starting][arrival];
sum += distance !== 0 ? distance : 987654321;
}
minValue = Math.min(sum, minValue);
});
*/
/* 아래 코드는 위 코드를 제너레이터를 통해 Lazy하게 수행하도록 한 것 */
let minValue = 987654321;
for (const perm of permutations(cities)) {
let sum = 0;
for (let i = 0; i < perm.length; i++) {
const starting = perm[i % perm.length];
const arrival = perm[(i + 1) % perm.length];
const distance = map[starting][arrival];
sum += distance !== 0 ? distance : 987654321;
}
minValue = Math.min(sum, minValue);
}
console.log(minValue);
});
주석에 써놨다시피 위 코드는 동작하지 않지만, 아래 코드는 동작한다.
Lazy한 방식이 자바스크립트의 한 줄기 빛이다...
메모리를 너무 많이 먹는 언어라서, Lazy하게 하지 않으면 메모리 초과가 뜬다.
반응형
'프로그래밍 > 알고리즘 풀이' 카테고리의 다른 글
[node.js] 연산자 끼워넣기 ( 백준 14888번 ) (0) | 2021.07.31 |
---|---|
[node.js] 로또 ( 백준 6603번 ) (0) | 2021.07.31 |
[node.js] 단어 수학 ( 백준 1339번) (0) | 2021.07.31 |
[node.js] 차이를 최대로 ( 백준 10819번 ) (0) | 2021.07.30 |
[node.js] 모든 순열 ( 백준 10974번 ) (0) | 2021.07.30 |