본문 바로가기
Algorithm/Baekjoon

백준 2743번, 9086번

by minhi 2024. 10. 31.

숫자만 주구장창 다루다가 이제 문자열 챕터로 들어왔다.

 

그러다보니 아주 간단한 부분들에서 약간의 시행착오가 있었는데 이를 정리해보고자 한다.

 

백준 2743번

let input = require('fs').readFileSync('/dev/stdin').toString().trim()

console.log(input.length)

 

사실 vscode에서 테스트해볼 땐 trim 메소드를 사용하지 않고도 정답을 출력해냈다.

 

그런데 백준에는 trim 메소드를 사용해야만 정답으로 인정된다.

 

종종 백준에서 채점할 때 사용하는 입력이 예시 입력과 다른 경우가 있는 것 같다.

 

백준 9086번

let [T, ...input] = require('fs').readFileSync('example.txt').toString().split('\n')

for (let i = 0; i < T; i++) {
  console.log(`${input[i][0]}${input[i][input[i].length-1]}`)
}

 

입력

3
ACDKJFOWIEGHE
O
AB

 

출력

A
O
AB

 

처음엔 위와 같이 작성하였고 출력 결과가 이상해서 input 값을 확인해보니

 

input 값이 [ 'ACDKJFOWIEGHE', 'O', 'AB' ] 가 아닌 [ 'ACDKJFOWIEGHE\r', 'O\r', 'AB' ] 였다.

 

사실 이때까지 줄바꿈으로 구분되어 주어지는 입력값들을 split('\n')하여 저장하면서 그때마다 \r을 만났었는데

 

어차피 숫자 연산이다보니 자동으로 숫자 자료형으로 변환되어 정답을 출력해내는데는 큰 영향을 끼치지 않았지만

 

문자열의 경우엔 \r도 하나의 문자로 간주되어 length 계산에 영향을 끼친다.

 

그래서 \r을 찾아보니, \r은 carriage return이라 부르는 것으로 Windows에선 \r\n으로 줄바꿈을 수행한다고 한다.

 

결국 아래와 같이 trim 메소드를 사용해 \r을 제거하였다.*

let [T, ...input] = require('fs').readFileSync('/dev/stdin').toString().split('\n')

input = input.map((value) => value.trim())

for (let i = 0; i < T; i++) {
  console.log(`${input[i][0]}${input[i][input[i].length-1]}`)
}

 

* vscode에서는 split('\n')을 split('\r\n')으로 수정해서 풀이할 수도 있지만 백준에서는 안 된다.

 

그리고 map 메소드는 비파괴적 처리로, map 메소드 결과를 사용하려면 원래 배열에 할당해주어야 한다는 것도 잊지 말자.

 

💫 이 문제를 통해 배운 것

•  Windows에서는 \r\n으로 줄바꿈을 수행하며, split('\n') 후 trim()으로 \r\n 모두 제거해주어야 한다.
•  map 메소드는 비파괴적 처리로, map 메소드 결과를 사용하려면 원래 배열에 할당해주어야 한다.

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

백준 10809번  (0) 2024.11.08
백준 11720번  (1) 2024.11.08
백준 1546번  (0) 2024.10.31
백준 10811번  (0) 2024.10.31
백준 5597번  (0) 2024.10.29