문제 자체는 쉬운 문제였지만 자바스크립트를 공부한 지 얼마 안되다 보니 새롭게 배운 점이 있어 기록을 위해 글을 남겨본다.
먼저 알고리즘은 간단하다. 한 문자열씩 for of문으로 돌면서 숫자인지 아닌지 판별하고 숫자형일 경우 문자가 나올때까지 합쳐서 배열에 넣고, 배열을 마지막에 정렬하여 출력하며 된다.
문제는 문제의 조건에서 각 줄은 최대 100글자라는 조건이 문제다. 엣지케이스를 생각해보면 가장 큰 수는 999...(100자리)일 것이다.
통상적으로 사용하는 javascript의 정수형 자료형은 Number인데 8바이트(64비트)를 사용한다. 이 중 1비트는 부호, 11비트는 지수부이고 52비트가 가수부이므로 Number자료형으로 표현할 수 있는 최대 정수는 2^53-1이다. 이는 당연하게도 문제의 엣지케이스인 999...(100자리)보다 작으므로 더 큰 메모리를 사용하는 자료형인 BigInt자료형을 사용해야 한다.
이때 문제가 생기는데 나는 배열에 숫자들을 넣은후 sort함수로 정렬하여 문제를 풀었다. 이때 lambda식으로 (a,b) => a-b을 주어서 정렬하고자 했는데 BigInt자료형으로 뺄셈연산을 한 후의 수는 BigInt자료형이고, sort함수는 인자로 Number자료형만을 받기에 문제가 생기는 것이다.
이를 해결하기 위해 sort함수의 lambda식에 삼항연산자를 이용해서 -1, 1, 0을 return하는 방식으로 문제를 풀 수 있었다.
문제 자체는 쉬웠지만 다른 언어를 공부하다 보니 그 언어의 특징들에 대한 이해가 부족해 생긴 문제이다.
const fs = require('fs');
const inpu = fs.readFileSync("./dev/stdin").toString().trim().split('\n');
const N = Number(inpu[0])
let answer = []
for (let i=1; i<=N; i++) {
let cash = ''
for(let j of inpu[i]){
if (!isNaN(j)){
cash += j
}
else if(isNaN(j)){
if (cash.length > 0){
answer.push(BigInt(cash))
}
cash = ''
}
}
if (cash.length > 0){
answer.push(BigInt(cash))
}
}
answer.sort((a, b) => (a < b) ? -1 : ((a > b) ? 1 : 0))
console.log(answer.join('\n').trim())
'Algorithm' 카테고리의 다른 글
백준 1325번: 효율적인 해킹(javascript, DFS) (0) | 2023.03.28 |
---|---|
백준 14502번: 연구소 (javascript, DFS) (0) | 2023.03.28 |
프로그래머스: 주차 요금 계산 (파이썬, 구현) (0) | 2022.12.20 |
프로그래머스: [3차] 압축 (파이썬, 구현) (0) | 2022.12.20 |
프로그래머스: k진수에서 소수 개수 구하기 (파이썬, 구현) (0) | 2022.12.19 |