백준에서 Javascript의 입력은 fs.readFileSync를 통해 버퍼를 통째로 읽어온다.
위의 /dev/stdin은 문제 채점시 입력 버퍼가 담겨있는 주소이다.
읽어온 버퍼를 .toString 메서드를 통해 문자열로 파싱하고, 가공해서 사용하면 된다.
https://www.acmicpc.net/problem/11382
11382번: 꼬마 정민
첫 번째 줄에 A, B, C (1 ≤ A, B, C ≤ 1012)이 공백을 사이에 두고 주어진다.
www.acmicpc.net
간단한 문제를 통해 입력을 받아보자. 문제에서 주어지는 입력은 공백을 기준으로 정수 A, B, C가 주어진다.
각자의 데스크탑 환경에서는 백준의 입력 상대주소인 /dev/stdin을 사용할 수 없으므로, txt파일을 만들어서 동일한 조건으로 입력을 만들어본다.
자바스크립트를 실행시킬 test.js와 동일한 경로에 input.txt를 만들었다.
txt 파일 안에는 문제의 조건과 동일하게 입력을 넣어준다.
input.txt의 상대 경로를 입력해 파일을 읽어온 후, String으로 파싱한 후 출력해보자.
값이 잘 들어온 걸 확인할 수 있다.
이제 문제를 처리하기 위해 String을 원하는 방식으로 파싱하고 처리해보자.
문자열(7 77 7777)을 split 메서드를 통해 공백 기준으로 쪼개고, input 배열로 반환했다.
반환된 배열의 원소를 각각 변수에 담고, + 연산자를 통해 정수로 변환했다.(Number()나 parseInt()를 사용해도 된다.)
이후 잘 더해진 걸 확인할 수 있다.
고차함수를 통해서 보다 간결하게 문제를 풀 수도 있다.
문자열을 배열로 만드는 과정은 동일한데, map 함수를 통해 배열의 원소를 정수로 변환하고, 배열로 반환했다. 이후 reduce 함수를 통해 합을 구했다.
마찬가지로 잘 출력된다.
이후 문제를 백준에 제출할 땐, readFileSync 안의 txt파일 주소 대신 백준의 입력 주소인 '/dev/stdin'을 넣어주면 된다.
제시된 문제의 경우 공백을 기준으로 숫자 3개가 입력의 전부지만, 문제에 따라 무지막지한 양의 입력을 받는 경우도 많기 때문에 고차함수의 사용이 필연적이다. 보다 많은 입력을 받는 문제를 풀어보자.
https://www.acmicpc.net/problem/2751
2751번: 수 정렬하기 2
첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.
www.acmicpc.net
문제에서 주어지는 입력은 최대 1,000,000줄이다. 첫째줄에는 수의 개수가 주어지고, 둘째줄부터는 수가 주어진다. 입력받은 수를 배열로 만들고, 정렬해서 출력해야 한다.
먼저 푼 문제와 동일한 방식으로 input.txt에 예제를 만든다. 문제의 예제에서는 5줄이 주어졌지만 확인을 위해 20줄을 넣었다.
이번 문제에서는 줄바꿈을 기준으로 입력을 받아야 하므로, String을 줄바꿈('\n') 기준으로 잘랐다.
배열의 원소를 정수로 바꿔주는 map 함수 안에 trim 메서드를 사용했다.
이는 윈도우에서의 줄바꿈이 \r\n이기 때문에 \n 기준으로만 자르면, 원소에 \r이 붙어서 나오기 때문에 넣어줬다.
백준에서의 입력은 리눅스 환경에서 제공하므로(줄바꿈이 \n임) 제출할 땐 trim 메서드를 제외해도 된다.
문제에서 첫번째 줄의 입력은 입력의 수를 의미하는데, 지금 문제 푸는 과정에서는 필요 없으므로 slice 메서드를 통해 배열을 0번 인덱스를 제외시키고 1번 인덱스부터 반환하였다. 만약 첫번째 줄의 입력이 필요하다면, 먼저 다른 변수에 담고 slice 하면 된다.
배열에 입력이 잘 들어간 걸 확인할 수 있다.
이제 문제에서 요구하는 대로, 만든 배열을 sort 메서드를 통해 정렬하고, join 메서드를 통해 원소 사이사이에 개행문자를 넣어서 하나의 문자열로 만든 후 출력한다.
잘 출력된다.
이런 방식으로 입력을 배열화 한 후, 배열을 조작하거나 배열의 값을 할당해서 문제를 풀면 된다.
입력이 함수의 매개변수로 주어져 함수를 만들기만 하면 되는 프로그래머스와는 달리, 백준은 입출력 모두 신경써서 구현해야 한다. 다소 불편하지만 배열을 다루는 과정에서 자바스크립트 공부가 될 수도 있다...
'알고리즘 > BOJ (Javascript)' 카테고리의 다른 글
(Javascript) 백준 3273번 : 두 수의 합 (0) | 2022.04.03 |
---|---|
(Javascript) 백준 2812번 : 크게 만들기 (0) | 2022.04.01 |
(Javascript) 백준 4358번 : 생태학 (0) | 2022.03.29 |
(Javascript) 백준 1620번 : 나는야 포켓몬 마스터 이다솜 (0) | 2022.03.26 |
(Javascript) 백준 1966번 : 프린터 큐 (0) | 2022.03.26 |