본문 바로가기

백준/JavaScript

[JS] 백준 2750번 수 정렬하기

728x90

 

자바스크립트도 해야 하는데...

자바스크립트도 해야 하는데...

 

이러다가는 C++ 만 하게 될 것 같아서 오늘은 자바스크립트를 하려고 한다.

자바스크립트는 예전에 학교 수업시간에 따라 해 본 것이 전부이기 때문에 문법이 어떤지 잘 모른다.

 

그래서 C++로 풀었던 문제들을 자바스크립트로 다시 풀어보면서 익히려고 한다.

그런데 막상 시작하려니... 내가 지금 할 수 있는 건 변수랑 함수밖에 없기에...

자바스크립트에 대해 검색하면서 문제를 풀어나가야겠다.

 

위에 처럼 하려했으나... 검색해도 나오는 정보가 없어서 정보가 있는 문제를 먼저 풀어보려 한다.

 

 

 

 

 

[node.js로 백준 풀 때 유의할 점들] https://tesseractjh.tistory.com/39

자바스크립트에 대해 찾다 보니 이런 것도 찾았다. Node.js로 백준 문제를 풀 때는 시간 초과가 나는 것을 막기 위해 readline보다 fs 모듈을 사용하는 것이 더 빠르다고 한다. FileSystem의 약자인 fs 모듈은 파일 처리를 하는 모듈로, 직접 입력 파일을 읽어와서 처리한다.

 

출력을 해줄 때 일부 입력값의 마지막에 개행문자가 포함된 경우가 있다고 한다. 이런 경우 split("\n")을 할 경우 공백문자 하나를 더 갖는 배열을 반환한다. 이를 방지하기 위해 trim()을 사용한다.

 

 

 

 

 

그럼 시작해 보자...

오늘의 문제다!

 

문제

https://www.acmicpc.net/problem/2750

 

2750번: 수 정렬하기

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

www.acmicpc.net

 

첫째 줄에는 수의 개수 N, 둘째 줄부터 N개의 줄에는 수가 주어진다. 이를 오름차순으로 정렬하여 한 줄에 하나씩 출력하라고 한다. 그러면 말 그대로 입력을 받고 오름차순으로 정렬한 후 한 줄에 하나씩 출력해 주면 되는데...

 

 

어떻게 입력받지...??

 

[입력값 받는 방법] https://velog.io/@imysh578/%EB%B0%B1%EC%A4%80-NodeJsJavascript-%EC%9E%85%EB%A0%A5%EA%B0%92-%EB%B0%9B%EB%8A%94-%EB%B0%A9%EB%B2%95

첫 번째 줄에는 입력 값의 길이(N), N개의 줄에 걸쳐서 한 줄에 하나의 입력값이 주어지니까 다음과 같은 방법을 사용하면 된다.

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

 

 

어떻게 정렬하지...??

 

[배열 정렬하기] https://hianna.tistory.com/409

배열을 정렬하기 위해 sort를 사용하는 것은 비슷하다. 두 숫자의 차이를 리턴하는 함수를 sort() 함수의 파라미터로 전달하여, 배열을 오름차순으로 정렬하면 된다.

const arr = [2, 1, 3];
arr.sort(function(a, b){
       return a - b;
});

 

 

그렇게 나 혼자 코드를 작성하여 출력해보려고 하는데

 

 

 

????

 

뭐지...  파일이나 디렉터리가 존재하지 않는다는 오류가 발생했다.

그래서 검색해 보니까 이게 경로 문제라고 한다. 해당 자바스크립트 파일이 어떤 디렉터리에서 실행 중인지 확인하고 그에 따른 상대 경로를 적어주거나 파일 전체 경로 __dirname+'/파일 이름.확장자'를 fs.readFileSync에 매개 변수로 전달해 주면 출력이 되는 것을 볼 수 있었다. 

 

그런데 백준 문제의 답으로 제출하려면 '/dev/stdin'으로 다시 바꿔줘야 한다...(주의주의)

 

음...

// 틀린 코드

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

// 오름차순 정렬
input.sort(function(a, b){
    return a - b;
});

for(let i = 0; i < n; i++){
    console.log(`${input[i]}\n`);
}

이렇게 해줬는데... 

 

이번엔 이렇게 나왔다. 도저히 모르겠어서 풀이를 찾아보았다.

 

 

이 분은 fs 모듈로 입력 값을 받아 줄 바꿈을 기준 값으로 배열을 만들어주고 입력값으로 만든 numbers 배열에서 shift()를 통해 첫 번째 요소를 추출하면서 제거해 주었다. 그리고 배열을 정렬한 후 forEach로 순서대로 출력해주었다고 한다.

const fs = require('fs');
const numbers = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
const N = numbers.shift();

/* 출력 값 */
numbers.sort((a, b) => a - b).forEach(num => console.log(num));
출처: https://aiday.tistory.com/115

[shift()가 뭐지] https://electronic-moongchi.tistory.com/67

 

 

아... 그리고 풀다 보니 생각난 건데... 이거 입력해서 확인을 못하네... ㅎㅎ

readline 모듈을 이용하면 콘솔을 통해 값을 입력받을 수 있다고 한다. 일단 오늘은 fs로 해보자...

[자바스크립트 콘솔에서 입력받는 방법] https://lakelouise.tistory.com/140

 

오! 그리고 찾다 보니 vsCode로 할 수 있는 방법이 있다고 한다.

https://wonyoung2257.tistory.com/36

 

오늘은 너무 피곤하니 나중에 다시 한번 봐야 될 것 같다.

 

 

 

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim().split("\n");
const n = input.shift();

// 오름차순 정렬
input.sort(function(a, b){
    return a - b;
}).forEach(num => console.log(num));

 

 

... 드디어 맞았다... ㅠㅠ

너무 오래 걸렸다...

처음 하는 거니까 자꾸 원래 쓰던 언어의 문법이 생각났다.

계속하면 익숙해지겠지...?

 

 

으... 오늘 진짜 너무 피곤하다.

기차 타고 와서 그런가...

 

벌써 새벽 3시... ㅠㅠ

집 오는데 하루를 다 써버렸다.

 

자야지... 모두 Good night~~

728x90