on
백준 node.JS 입출력 관리
백준 node.JS 입출력 관리
백준에서 JavaScript를 사용하여 문제를 풀게 될 경우 테스트 케이스 입력에 관한 스켈레톤 코드를 제공하는 프로그래머스나 LeetCode 플랫폼 등과는 다르게 사용자가 직접 파일을 읽어서 테스트 케이스를 입력받는 사전 설정 코드를 작성해줘야 한다.
지금까지는 백준에서 문제 지문만 가져와 외부 코드 에디터에서 알고리즘 로직을 작성하거나 solution 함수 내부에서 문제만 풀어도 되는 프로그래머스를 사용하였는데 백준에서 조금 더 다양한 문제를 풀어보고 싶은 욕심에 nodeJS의 입출력 관리에 대해서 다음 백준 문제를 예시로 포스팅하고자 한다.
문제
https://www.acmicpc.net/problem/4344
nodeJS 입출력 관리
우선 테스트 케이스가 있는 파일을 불어오기 위해서는 fs 내장 모듈이 필요하다.
파일 처리와 관련된 작업을 하는 모듈로, 보통 FileSystem을 줄여서 fs 모듈이라고 줄여 부릅니다.
fs 내장 모듈을 현재 파일에 불러온 뒤 readFileSync 메서드를 사용하여 해당 파일 내의 데이터를 문자열로 반환 받아 input 변수에 저장합니다.
// 5 // 5 50 50 70 80 100 // 7 100 95 90 80 70 60 50 // 3 70 90 80 // 9 100 99 98 97 96 95 94 93 91 const fs = require('fs'); let input = fs.readFileSync('./input.txt').toString();
input의 값을 확인하기 위해 콘솔로 찍어보면 다음과 같이 문자열 형태로 이루어진 테스트 케이스 값이 나오는 걸 확인할 수 있습니다.
"5
5 50 50 70 80 100
7 100 95 90 80 70 60 50
3 70 90 80
9 100 99 98 97 96 95 94 93 91"
하지만 이 값으론 알고리즘 로직에 바로 적용할 수 없어 다음과 같이 split() 메서드를 사용하여 줄바꿈 기준으로 구분된 하나의 배열을 새롭게 생성해 줍니다.
// 5 // 5 50 50 70 80 100 // 7 100 95 90 80 70 60 50 // 3 70 90 80 // 9 100 99 98 97 96 95 94 93 91 const fs = require('fs'); let input = fs.readFileSync('./input.txt').toString(); input = input.split('
');
['5',
'5 50 50 70 80 100',
'7 100 95 90 80 70 60 50',
'3 70 90 80',
'9 100 99 98 97 96 95 94 93 91']
현재 모든 케이스 테이스들이 하나의 배열 내에 적재되어 있기 때문에 이를 알고리즘 로직에 하나씩 적용시켜 주기 위해서는 한번 더 정제해주는 작업이 필요합니다.
우선 첫번째 요소 input[0]인 5는 테스트 케이스 숫자이기 때문에 다음과 같이 별도로 값을 생성해줘야 됩니다.
// 5 // 5 50 50 70 80 100 // 7 100 95 90 80 70 60 50 // 3 70 90 80 // 9 100 99 98 97 96 95 94 93 91 const fs = require('fs'); let input = fs.readFileSync('./input.txt').toString(); input = input.split('
'); const testCaseNum = input[0]
여기서 주의할 점이 현재 저장되어 있는 input 내의 첫 번째 요소 값을 그대로 가져온다면 숫자값이 아닌 문자값을 가져옵니다.
이를 숫자값을 가져오기 위해서 다음과 같이 코드를 추가하였습니다.
// 5 // 5 50 50 70 80 100 // 7 100 95 90 80 70 60 50 // 3 70 90 80 // 9 100 99 98 97 96 95 94 93 91 const fs = require('fs'); let input = fs.readFileSync('./input.txt').toString(); input = input.split('
'); const testCaseNum = +input[0] //const testCaseNum = Number(input[0])
숫자값으로 바꿀 경우에는 +단항 연산자를 사용할 수도 있고 Number() 및 parseInt()를 사용할 수도 있습니다.
다음으로 실제 테스트 케이스에 쓰일 요소들을 문제에 하나씩 받아들일 수 있도록 배열로 각 요소를 순회하며 띄어쓰기 기준으로 새로운 배열들을 생성해줘야 됩니다. (이때도 테스트 케이스 숫자와 마찬가지로 각 요소들을 모두 숫자값으로 바꿔줘야 됩니다)
// 5 // 5 50 50 70 80 100 // 7 100 95 90 80 70 60 50 // 3 70 90 80 // 9 100 99 98 97 96 95 94 93 91 const fs = require('fs'); let input = fs.readFileSync('./input.txt').toString(); input = input.split('
'); const testCaseNum = +input[0] //const testCaseNum = Number(input[0]) for(let i = 1; i <= testCaseNum; ++i) { const arr = input[i].split(' ').map((item) => +item); break; }
['5', '50', '50', '70', '80', '100'],
['7', '100', '95', '90', '80', '70', '60', '50'],
['3', '70', '90', '80'],
['9', '100', '99', '98', '97', '96', '95', '94', '93', '91']
위 map() 메서드를 이용하여 숫자값으로 요소를 정제하는 과정은 아래 코드를 축약한 것입니다.
// 5 // 5 50 50 70 80 100 // 7 100 95 90 80 70 60 50 // 3 70 90 80 // 9 100 99 98 97 96 95 94 93 91 const fs = require('fs'); let input = fs.readFileSync('./input.txt').toString(); input = input.split('
'); const testCaseNum = +input[0] //const testCaseNum = Number(input[0]) for(let i = 1; i <= testCaseNum; ++i) { const arr = input[i].split(' '); //.map(item => +item); let newArr = []; for(let i = 0; i < arr.length; ++i) { newArr.push(+arr[i]); } break; }
전체 input 관리 코드
// 5 // 5 50 50 70 80 100 // 7 100 95 90 80 70 60 50 // 3 70 90 80 // 9 100 99 98 97 96 95 94 93 91 const fs = require('fs'); let input = fs.readFileSync('./input.txt').toString(); input = input.split('
'); const inputC = +input[0]; const inputTestCase = []; for(let i = 1; i <= inputC; ++i) { const arr = input[i].split(' ').map((item) => +item); let newArr = []; for(let i = 0; i < arr.length; ++i) { newArr.push(arr[i]) } const testCase = { N: arr[0], arr: newArr }; inputTestCase.push(testCase); break; } function solution(C, testCase) { console.log('C :', C); console.log('testCase :', testCase); } solution(inputC, inputTestCase);
C: 5
inputTestCase: [
{ N: 5, arr: [50, 50, 70, 80, 100] },
{ N: 7, arr: [100, 95, 90, 80, 70, 60, 50] },
(...)
]
최종 결과값을 확인하기 위해서 최종적으로 console.log()를 통해 입력 받은 값을 출력해줘야 된다.
from http://choi95.tistory.com/142 by ccl(A) rewrite - 2021-08-22 17:00:34