JavaScript로 코딩테스트 준비하기 - 입출력에 대한 이야기

자바스크립트에서 입력받기

Python으로는 간단하게 input()을 사용해서 키보드의 입력을 받아서 처리할 수 있었다. 하지만 이번에 VSCode에서 JavaScript로 알고리즘 문제를 풀면서 키보드로 받은 입력 값을 처리하려고 했는데 입력 이벤트를 계속 받고는 있지만 입력 이벤트가 끝나지 않았다.
왜 이런지 이해가 되지 않아서 방법을 찾아보던 도중에 해결방법을 찾았다.
바로 입력이 끝났다면 ctrl + D를 눌러서 입력 종료를 알려주는 것이다.

예상하지 못한 JavaScript 입/출력 부분의 문제로 계획하지 않은 입출력 관련된 내용으로 포스팅을 하게 되었다.

JavaScript에서 입출력은 fs(file system) 모듈을 사용한다. fs모듈의 readFileSync() 함수를 사용해서 파일이나 표준 입출력을 입력받게 되는데, 아래 예시 코드에서 0을 입력해주는 이유는 표준입력(stdin: standard input)이 파일 설명자로 0이기 때문이다.

nodejs에서 File system에 관한 공식문서 내용은 아래 링크를 참조하도록 하자.
https://nodejs.org/dist/latest-v14.x/docs/api/fs.html#fs_file_system

따라서 별도의 파일을 읽지 않고 표준 입력을 받는 경우에는 내부에 0이라는 인수를 넘겨준다. 0과 함께 encoding을 명시해줘야 하는데 별도로 명시하지 않고 표준입력의 설명자 0만을 넘겨준 경우에는 toString()함수를 사용해서 별도로 String 타입으로 변환을 해줘야 한다.
(변환을 안해주게 되면 <Buffer 31 30 0a>와 같은 raw buffer가 결과값으로 나온다)

1
2
3
4
5
6
7
8
9
const fs = require('fs');

const inputWithNoEncoding = fs.readFileSync(0).toString().split('\n');

const inputWithEncoding = fs.readFileSync(0, 'utf8').split('\n');

const cvtInputToNumber = fs.readFileSync(0, 'utf8').split('\n');
// ['10', '']와 같은 배열의 형태로 값이 반환되기 때문에 [0]번째 인덱스 값을 가져온다.
console.log(Number(cvtInputToNumber[0]));

참고로 readFileSync()의 내부에 작성해준 /dev/stdin은 백준 알고리즘 문제 풀이에서 입력 예제를 넣고 그 파일을 읽어 실행하게 만들기 위해서 작성해준 것이다.

JavaScript에서 입력받는 방법은 앞서 설명한 fs(File System) 모듈을 사용한 방법과 readline 모듈을 사용한 방법이 있다.
readline 모듈은 process.stdin이나 file stream과 같은 Readable stream에서 line by line으로 데이터를 읽어들이기 위한 interface를 제공한다.

1
2
3
4
5
6
7
8
9
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});

rl.on('line', (input) => {
console.log(`received: ${input}`);
});
Read more

Baekjoon Online Judge 10825번 국영수 문제

백준 저지 10825번 국영수 문제 Pseudo code + Python code

문제풀이 접근 방식 : 튜플과 리스트 자료형을 사용한 정렬

Pseudo code

본 코드 (통과/PyPy3 - 231312KB / 3372ms) (시간초과/Python3)

시간초과가 발생하는 경우 PyPy3를 사용해서 코드를 테스트해보도록 하자.
이 시점에서 간단하게 PyPy3에 대해서 살펴보자.

1
2
3
4
5
6
7
8
9
10
11
n = int(input())
student_list = []

for _ in range(n):
(name, korean, english, math) = input().split(' ')
student_list.append((name, eval(korean), eval(english), eval(math)))

sorted_list = sorted(student_list, key=lambda x: (-x[1], x[2], -x[3], x[0]))

for student in sorted_list:
print(student[0])
Read more

Baekjoon Online Judge 17609번 회문/유사회문 문제 (다각도에서 문제 바라보기)

백준 저지 17609번 회문/유사회문 문제 Pseudo code + Python code

문제풀이 접근 방식 : 재귀호출

Pseudo code #1 RecursionError

본 코드 #1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
shift_flag = False


def palindrome(input_str):
global shift_flag
if len(input_str) <= 1:
if shift_flag:
return 1
return 0

if input_str[0] != input_str[-1]:
if input_str[0] == input_str[-2]:
shift_flag = True
input_str = input_str[0:-1]
elif input_str[1] == input_str[-1]:
shift_flag = True
input_str = input_str[1:]
else:
return 2

return palindrome(input_str[1:-1])


n = int(input())
for _ in range(n):
input_str = input()
print(palindrome(input_str))
Read more

Baekjoon Online Judge 2747번 피보나치 수 문제 (다양한 방법으로 풀기)

백준 저지 2747번 피보나치 수 문제 Pseudo code + Python code

이 문제는 피보나치 수를 구하는 문제로, for-loop와 memoization, recursive 개념을 활용해서 풀이를 해보았다.
피보나치 수열의 값은 이미 계산된 값들의 누적 합으로 구성이 된다. 따라서 이미 계산된 부분은 별도의 변수에 값을 저장했다가 필요할때 참조하게 되면 빠르게 원하는 값을 도출해낼 수 있다.(fibonacci-memoization)

손코딩으로 작성한 코드 중 for-loop로 풀이한 부분의 초기리스트로 [1,1]이 아닌 [0,1]로 초기화를 시켜줘야 한다.(수정)

Read more

Baekjoon Online Judge 1302번 베스트 샐러 문제

백준 저지 1302번 베스트 샐러 문제 Pseudo code + Python code

손 코딩을 한 코드에서 sorted로 정렬을 한 뒤에 list로 변환을 하였는데, dictionary type의 데이터를 items()로 하게 되면, 리스트 내에 튜플(key, value쌍)로 변환이 되기 때문에 그럴 필요가 없었다. 정렬된 튜플 데이터 리스트에서 첫번째 요소의 첫번째(book title-(key))를 추출하게 되면 가장 높은 판매 수를 기록한 책의 제목을 추출할 수 있다.

1
2
3
4
5
6
7
8
n = int(input())
sold_book = dict()
for _ in range(n):
book_title = input()
sold_book[book_title] = sold_book.get(book_title, 0) + 1
sorted_sold_book = sorted(sold_book.items(), key=lambda x: x[1], reverse=True)
print(sorted_sold_book[0][0])

Read more

Baekjoon Online Judge 1236번 성 지키기 문제

백준 저지 1236번 성 지키기 문제 Pseudo code + Python code

손 코딩에서 이중 for문 처리하는 부분에서 수정이 필요하다. 이중 for문에서 i,j를 이용해서 내부 반복처리를 해야하는데, 손 코딩할때 n과 m을 넣어 처리를 했다. 이 부분을 i와 j로 수정해서 넣어줘야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
n, m = map(int, input().split())
security_in_castle_list = []
for _ in range(n):
security_in_castle_list.append(input())
castle_row = [0]*n
castle_column = [0]*m
for i in range(n):
for j in range(m):
if security_in_castle_list[i][j] == 'X':
castle_row[i] += 1
castle_column[j] += 1
castle_zero_row = 0
for row in castle_row:
if row == 0:
castle_zero_row += 1
castle_zero_column = 0
for col in castle_column:
if col == 0:
castle_zero_column += 1
print(max(castle_zero_row, castle_zero_column))

Read more

Baekjoon Online Judge 1966번 프린터 큐 문제

백준 저지 1966번 프린터 큐 문제 Pseudo code + Python code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
test_case = int(input())
for _ in range(test_case):
task_num, search_index = map(int, input().split())
test_priority_list = list(map(int, input().split()))
print_task_list = [(p, i) for i, p in enumerate(test_priority_list)]

print_task_count = 0
while True:
if print_task_list[0][0] == max(print_task_list, key=lambda x: x[0])[0]:
print_task_count += 1
if print_task_list[0][1] == search_index:
print(print_task_count)
break
else:
print_task_list.pop(0)
else:
print_task_list.append(print_task_list.pop(0))
Read more

Baekjoon Online Judge 1543번 문서 검색 문제

백준 저지 1543번 문서 검색 문제 Pseudo code + Python code

손코딩한 코드에서 논리적 오류를 발견했다. document에서 검색하고자 하는 문자열의 길이만큼 slicing할때, 시작 인덱스(start_index)부터 검색 문자열의 길이(search_word)까지가 아닌, 시작 인덱스(start_index)에서 검색 문자열의 길이(len(search_word))만큼 더한 곳 까지 slicing한 문자열을 비교해야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
document = input()
search_word = input()
search_count = 0
start_index = 0

while (len(document)-start_index) // len(search_word) != 0:
# 아래의 조건도 위의 조건을 대체할 수 있다.
# while len(document)-start_index >= len(search_word):
if document[start_index:start_index+len(search_word)] == search_word:
start_index += len(search_word)
search_count += 1
else:
start_index += 1

print(search_count)
Read more

Baekjoon Online Judge 2212번 센서문제

백준 저지 2212번 센서문제 Pseudo code + Python code

1
2
3
4
5
6
7
8
9
10
11
sensor_num = int(input())
station_num = int(input())
sensor_loc_list = list(map(int, input().split()))
sensor_loc_list.sort()
distance = []
for i in range(1, sensor_num):
distance.append(sensor_loc_list[i]-sensor_loc_list[i-1])
distance.sort(reverse=True)
for i in range(station_num-1):
distance[i] = 0
print(sum(distance))
Read more

Baekjoon Online Judge 11650번 x, y 좌표 정렬문제

백준 저지 11650번 x, y 좌표 정렬문제 Pseudo code + Python code

1
2
3
4
5
6
7
8
9
10
11
n = int(input())
axis_list = []
for _ in range(n):
x, y = map(int, input().split())
axis_list.append((x, y))
axis_list.sort(key=lambda x:(x[0], x[1]))
# Tuple은 정렬을 해주면, 첫 번째 요소에 대해서 오름차순 정렬을 해주고, 첫 번째 요소가 같은 경우, 두 번째 요소에 대해서 자동으로 오름차순 정렬을 해준다.
# 아래의 정렬은 위와 같은 결과를 갖는다.
# axis_list.sort()
for i in axis_list:
print(i[0], i[1])
Read more