[Softeer] input값 읽기 Tip
반응형
1. 배경
sorteer에서는 프로그래머스와 달리 input 값을 읽어와서 console.log()로 출력하는 요건이다.
그래서 node.js 실무 코드 작성할 때 처럼 fs 모듈을 이용해서 읽어왔었음.
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin', 'utf8');
const inputs = input.trim().split('\n');
const [first, ...args] = inputs
let [w, n] = first.split(' ')
이렇게 풀이를 해오다 이슈가 발생함.
그건 바로 메모리 이슈. 256MB 제한에 걸려버림
2. 해결책
Node.js의 readline을 써서 입력을 스트림으로 처리하면 메모리를 아낄 수 있음
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
// 사용할 변수 선언 및 초기값 할당
let W = 0, N = 0;
const items = [];
// input 처리
rl.on('line', (line) => {
// 1번째 라인
if (!W) {
[W, N] = line.trim().split(' ').map(Number);
} else {
const [m, p] = line.trim().split(' ').map(Number);
items.push([m, p]);
if (items.length === N) {
rl.close(); // 모든 금속 정보를 다 받았으면 종료
}
}});
// 로직 처리
rl.on('close', () => {
// ...
});
3. 이슈 원인
제약조건
1 ≤ N ≤ 106인 정수
1 ≤ W ≤ 104인 정수
1 ≤ Mi, Pi ≤ 104인 정수
입력형식
첫 번째 줄에 배낭의 무게 W와 귀금속의 종류 N이 주어진다. i + 1 (1 ≤ i ≤ N)번째 줄에는 i번째 금속의 무게 Mi와 무게당 가격 Pi가 주어진다.
입력 예제1
100 2
90 1
70 2
입력 형식에 i+1 부터 N까지 총 N줄이 입력될 수 있음.
N의 범위는 최소 1 ~ 최대 1,000,000(백만) -> 즉, 100만줄 * 2 (줄마다 숫자 2개)
- "숫자 숫자\n" × 1,000,000 = 약 15~25MB 텍스트
- 파싱 후 .split() → 배열 크기, 객체 생성, 중복 메모리 → 복합적으로 100MB 이상 쓸 수 있음
💥 메모리 초과 원인은:
- 입력을 한꺼번에 문자열로 읽고 파싱했기 때문
반응형
'프로그래밍 > Algorithm' 카테고리의 다른 글
[Softeer] lv2. [21년 재직자 대회 예선] 전광판 / Javascript (1) | 2025.04.24 |
---|---|
[Softeer] lv2. 금고털이 풀이 / Javascript (0) | 2025.04.23 |
[Algorithm] 프로그래머스 > 이상한 문자 만들기 (3) | 2020.12.30 |
[Algorithm] 프로그래머스 > 평균 구하기 (2) | 2020.12.29 |
[Algorithm] 프로그래머스 > 핸드폰 번호 가리기 (1) | 2020.12.28 |
댓글
이 글 공유하기
다른 글
-
[Softeer] lv2. [21년 재직자 대회 예선] 전광판 / Javascript
[Softeer] lv2. [21년 재직자 대회 예선] 전광판 / Javascript
2025.04.24 -
[Softeer] lv2. 금고털이 풀이 / Javascript
[Softeer] lv2. 금고털이 풀이 / Javascript
2025.04.23 -
[Algorithm] 프로그래머스 > 이상한 문자 만들기
[Algorithm] 프로그래머스 > 이상한 문자 만들기
2020.12.30 -
[Algorithm] 프로그래머스 > 평균 구하기
[Algorithm] 프로그래머스 > 평균 구하기
2020.12.29