백준 2738번을 풀어보았다.
let [NM, ...input] = require('fs').readFileSync('/dev/stdin').toString().split('\n')
let [N, M] = NM.split(' ').map(Number)
input = input.map((value) => value.trim().split(' ').map(Number))
let output = ''
for (let i = 0; i < N; i++) {
for (let j = 0; j < M; j++) {
output += input[i][j] + input[i+N][j] + ' '
}
output += '\n'
}
console.log(output.trim())
결국 해결하긴 했지만 얼렁뚱땅 풀다보니 시행착오를 많이 겪었다.
1. 자료형에 유의하자.
처음에는 위 코드의 두 번째 줄과 세 번째 줄을 아래와 같이 작성하였고
let [N, M] = NM.split(' ')
input = input.map((value) => value.trim().split(' '))
그러자 반복문을 실행하며 아래와 같은 에러가 발생하였다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
output += input[i][j] + input[i+N][j] + ' '
^
TypeError: Cannot read properties of undefined (reading '0')
at Object.<anonymous> (C:\Users\minha\Desktop\boj-javascript\7. 2차원 배열\2738.js:13:39)
at Module._compile (node:internal/modules/cjs/loader:1256:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1310:10)
at Module.load (node:internal/modules/cjs/loader:1119:32)
at Module._load (node:internal/modules/cjs/loader:960:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:23:47
Node.js v18.17.0
|
cs |
input[i+N]이 undefined이기 때문에 input[i+N][j]를 읽을 수 없다는 것이었는데,
아무리 확인해봐도 out of range는 아닌 것 같은데 왜 undefined일까 고민해보니
i는 숫자, N은 문자로, 숫자와 문자 사이의 + 연산자는 덧셈이 아닌 concatenate로 작동한다.
즉 i+N은 3, 4, 5가 아닌 '03', '13', '23'이었던 것이다.
그리고 현재 input의 요소들도 문자로, input[i][j] + input[i+N][j]을 덧셈으로 처리하려면 수정이 필요하다.
결론적으로는 아래와 같이 수정하였다.
let [N, M] = NM.split(' ').map(Number)
input = input.map((value) => value.trim().split(' ').map(Number))
2. map 메소드와 콜백함수
문제를 풀다보면 map 메소드를 사용해 배열 내 원소 각각에 대해 함수를 적용해야 하는 경우가 많다.
보통 Number, trim 메소드를 사용하는데, 쓸 때마다 헷갈린다.
> let array = ['1 ', '2', '3']
undefined
> array.map(Number)
(3) [1, 2, 3]
> array.map((value) => Number(value))
(3) [1, 2, 3]
> array.map(trim)
VM412:1 Uncaught ReferenceError: trim is not defined
at <anonymous>:1:11
(anonymous) @ VM412:1
> array.map((value) => value.trim())
(3) ['1', '2', '3']
Number 메소드는 그냥 전달하든, 화살표 함수를 사용하든 모두 가능하지만 trim 메소드는 화살표 함수를 사용해야만 가능하다.
콜백함수의 형태에 따라 전달 방식이 달라진다는 점에 유의하자.
💫 이 문제를 통해 배운 것
• 항상 자료형에 유의하자.
• map 메소드 사용 시, 콜백함수의 사용 방법에 따라 전달 방식이 달라진다는 점에 유의하자.