본문 바로가기
Algorithm/Baekjoon

백준 2738번

by minhi 2024. 12. 30.

백준 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 메소드 사용 시, 콜백함수의 사용 방법에 따라 전달 방식이 달라진다는 점에 유의하자.

'Algorithm > Baekjoon' 카테고리의 다른 글

백준 10798번  (0) 2025.01.01
백준 2566번  (0) 2025.01.01
백준 10988번  (0) 2024.12.30
백준 2444번  (0) 2024.12.30
백준 3003번  (0) 2024.11.15