[TIL] 구름 코딩테스트 Node.js 입출력

syong·2023년 3월 6일
1

TIL

목록 보기
32/32

프로그래머스만 사용해서 코딩테스트를 여태 준비해왔었는데 입출력값을 받을 코드까지 고려해야 하는 시스템에서는 백준에서 한 두개 풀어본 문제 외에 처음 다루는지라 엄청나게 헤맸다. 이것은 그 헤맨 시간에 대한 기록이다.

1. node.js 기본 스켈레톤 코드

// Run by Node.js
const readline = require('readline');

(async () => {
	let rl = readline.createInterface({ input: process.stdin });
	
	for await (const line of rl) {
		console.log('Hello Goorm! Your input is', line);
	
		rl.close();
	}
	
	process.exit();
})();

처음 이 코드를 마주하고 굉장히 당황했다. fs.readFile 형태도 아니었고 프로그래머스의 간단한 solution 함수 코드만 봐오다가 이런 형태의 입출력 방식은 처음이었기 때문이다.
이제 이 코드를 하나씩 뜯어보도록 하자.

우선 rl.close(); 코드가 가장 중요한데, 이 코드는 실행된 프로세스를 종료하는데 필요한 코드이다. 이 코드를 지우게 되면 실행시 프로세스가 종료되지 않고 사용자는 계속해서 input값을 삽입할 수 있다. 종료하는 방법은 강제종료하는 방법 외에는 없다.
그리고 이 코드는 프로세스의 종료에만 관여를 할 뿐 채점시에 실행 결과에는 영향을 주지 않는다. 한마디로 프로세스를 종료시키는 코드가 없다고 하더라도 출력값만 제대로 나온다면 정답으로 처리된다.

그렇다면 해당 코드는 왜 필요한걸까? 아직까지 정확히 어떤 과정을 거쳐서 코드가 실행되는지 완벽히 이해하지 못했지만, 적어도 문제를 푸는 과정 중에 필요한 지식으로는 한 가지가 있다.
해당 코드가 없다면 테스트케이스를 돌리기 전 실행환경에서 실행시킬 때 따로 작성한 답변 코드의 동작이 어떻게 되는지 확인할 수 없다. 입력예시를 입력하고 엔터를 눌러도 프로세스가 종료되지 않으니 프로세스 종료 코드를 만나기 전까지 그 외에 작성한 코드들의 출력값이 콘솔에 보이지 않게 된다.

아직까지 알아낸 것은 여기까지인데 제대로된 동작 과정을 이해하는 것이 필요할 것 같다.

2. 실전 예제 코드

문제: https://level.goorm.io/exam/171960/%EC%88%AB%EC%9E%90-%EC%A0%9C%EA%B1%B0-%EC%A0%95%EB%A0%AC/quiz/1

입력예시

7
1 1 3 3 3 2 2

출력예시

1 2 3

작성 코드

const solution = (N, data) => {
	data = data.sort((a, b) => Number(a) - Number(b)); // 오름차순 정렬
	data = [...new Set(data)]; // 중복 제거
	console.log(data.join(" ").concat('\n')); // 결과값 출력
};

const readline = require('readline');

(async () => {
  let rl = readline.createInterface({ input: process.stdin });
  let N = null; // 테스트케이스 한 줄의 요소 개수 초기화
  let data = [];

  for await (const line of rl) {
		if (!line) {
          // solution(N, data);
			rl.close(); // 입력값의 마지막 줄에 도달하면 프로세스 종료
		}
    	if (!N) {
      		N = +line; // 첫 줄의 테스트케이스 개수를 number type으로 바꿔서 N에 할당
    	} else {
      		data = line.split(' ').map((el) => +el); // 두 번째 줄의 테스트케이스를 solution 함수에 넘겨줄 data 변수에 필요한 형태에 맞게 가공하여 할당
    	}
    
  }

	solution(N, data);
  process.exit();
})();

solution 함수를 분리해서 최상단에 정의해주고 출력값에 맞게 정답을 문자열로 가공한 후 콘솔 출력을 넣어준다. 이 콘솔 출력이 채점시 출력값으로 인지되어 채점된다. 주의해야할 점은 이 solution함수는 반드시 스켈레톤 코드의 반복문 바깥에서 호출해야 한다. 반복문 안에서 호출하게 되면 채점시 출력값에 아무것도 출력되지 않는다. 이 이유에 대해서도 자세히 알아볼 필요가 있을 것 같다.

이 문제의 테스트케이스는 입력시 두 줄을 입력하게 되는데 첫 줄은 테스트케이스 한 줄의 요소들의 개수를 의미하고 두번째줄 부터 테스트할 진짜 테스트케이스이다. 이 진짜 테스트케이스가 solution함수의 인자로 제대로 들어가도록 data 변수의 값을 세팅해주는 것이 중요하다. 해당 문제에서는 이런 방식이 적합할 수도 있지만 입출력 예시가 다른 문제에서는 또 다른 식으로 세팅해주어야 한다.

참고로 주석처리된 코드는 채점시가 아닌 실행시에 작성한 solution함수의 동작을 확인하기 위해 삽입했다. 정답 채점에는 영향을 주지 않는다. 정답 채점에 영향을 주는 콘솔 출력은 process.exit() 바로 전의 호출 코드에서 이루어진다.

참고자료: https://velog.io/@grap3fruit/%EA%B5%AC%EB%A6%84goorm-%EC%BD%94%ED%85%8C-javascript-%EB%A1%9C-%EC%9E%85%EB%A0%A5%EA%B0%92-%EB%B0%9B%EB%8A%94-%EB%B0%A9%EB%B2%95#case-2

0개의 댓글