코딩/알고리즘

백준 javascript 2588: readline 모듈

코딩쪼렙 2023. 3. 4. 17:24
728x90

문제

 

(세 자리 수) × (세 자리 수)는 다음과 같은 과정을 통하여 이루어진다.

 

 

 

 

(1)과 (2)위치에 들어갈 세 자리 자연수가 주어질 때 (3), (4), (5), (6)위치에 들어갈 값을 구하는 프로그램을 작성하시오.

 

입력

 

첫째 줄에 (1)의 위치에 들어갈 세 자리 자연수가, 둘째 줄에 (2)의 위치에 들어갈 세자리 자연수가 주어진다.

 

출력

 

첫째 줄부터 넷째 줄까지 차례대로 (3), (4), (5), (6)에 들어갈 값을 출력한다.

 

예제 입력 1

 

472

385

 

예제 출력 1

 

2360

3776

1416

181720

 

CODE

1.입력데이터를 숫자로 변환하여 저장한 뒤 수학적 계산

/n: 줄바꿈을 의미 함

split(" ") 이렇게 공백으로 작성하면 틀리게 됨.

const fs = require('fs');
const [A, B] = fs.readFileSync('/dev/stdin').toString().split('\n').map(Number);

  console.log(A*(B%10));
  console.log(A*(Math.floor((B%100)/10)));
  console.log(A*(Math.floor(B/100)));
  console.log(A*B);

2.입력 데이터를 문자열 상태로 놔두고 split(" ")로 문자 하나씩 분리해서 배열로 저장,

그 후, reverse()로 배열을 뒤집고 map()으로 각 원소에 곱 연산.

연산 결과는 push()를 이용하여 배열에 밀어넣어준다.  이를 join()을 사용하여 출력.

join('\n')은 배열 원소 구분자를 \n로 바꾼 뒤 전부 이어붙여 하나의 문자열로 만드는 기능을 한다.

예시1) ["2", "3", "4"] --> join() --> 2,3,4
예시2) ["2", "3", "4"] --> join("") --> 234
예시3) ["2", "3", "4"] --> join("-") --> 2-3-4

const fs = require('fs');
const [A, B] = fs.readFileSync('/dev/stdin').toString().trim().split('\n');

const num1 = parseInt(A);
const num2 = B.split('').map(Number); // [3, 8, 5]
let result = num2.reverse().map((x) => x*num1); // [5*num1, 8*num1, 3*num1]
result.push(num1*parseInt(B)); // [5*num1, 8*num1, 3*num1, num1*parseInt(B)]

console.log(result.join('\n'));
// 5*num1
// 8*num1
// 3*num1
// num1*parseInt(B)

 

3.readline으로 작성하기

'readline' 모듈 : 한 번에 한 줄 씩 데이터를 읽기 위한 인터페이스를 제공하는 모듈

//모듈 불러오기
const readline = require('readline');

//인터페이스 생성하기
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
});

let input = [];

function lineHandler(line){ //line이라는 변수를 입력
	input.push(line);//1줄씩 입력받고 무한으로 입력받음
    //컨트롤+D를 누르면 종료 됨 백준에서는 입력끝나면 종료
}

function closeHandler (){
    let num1 = Number(input[0]);
    let num2 = Number(input[1]);

    console.log(num1 * (num2 % 10));
    console.log(num1 * Math.floor((num2 % 100) / 10));
    console.log(num1 * Math.floor(num2 / 100));
    console.log(num1 * num2);

	//프로세스 종료
 	process.exit();
};

//입출력 처리 코드
rl.on('line',lineHandler);
rl.on('close',closeHandler) //원하는 함수 실행

\

 

이전 단계의 문제들과 다르게 공백으로 구분지어 두 수를 받는 것이 아니라, 줄 바꿈을 통해서 두 수를 입력받는다.

따라서 line.split(' ')이 아니라 push(line)을 이용해 준다.

다만 이전에 rl.close()로 한 줄을 받고 끝낸 것과 달리 이번에는 input.push(line)으로 인해 입력을 무한으로 받게된다.(콘솔에서)

따라서 두 줄을 입력받고 싶다면 두 줄을 입력받고 Ctrl + D를 통해 끝내준다.

처음에 lineClose 안에 rl.close() 입력해서 틀린 답이되었는데 이유는

위 코드는 사용자로 부터 한 줄의 입력만 받고 프로그램이 끝나게 되기 때문이다.

Comment

 

몫을 구할 때는 소수점이 나오기 때문에, Math.floor(버림) 을 이용하는 걸 까먹어서는 안된다.

 

1의 자리는 10으로 나눈 나머지를 구하면 되고

 

10의 자리는 100으로 나눈 나머지를 10으로 나눈 몫으로 구하면 되고

 

100의 자리는 100으로 나눈 몫을 구하면 된다.  

콘솔에서 close를 하는 방법

일반적으로 콘솔에서는 계속해서 입력 이벤트를 기다리고 있기 때문에 close가 실행되지 않는다. 그러나 리눅스의 경우 콘솔에서 ctrl + D 를 입력하면 EOF에 걸리게 된다(윈도우라면 gitbash를 통해 node파일을 실행시킨 후 입력이 다 되었다면 ctrl + D를 누르면 된다). 위의 코드의 경우 1 -> enter -> 2 -> ctrl + D 를 입력하면 된다.

References

readline모듈 사용하기 

https://velog.io/@leenzy/readline-%EB%AA%A8%EB%93%88-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0