일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 28 | 29 | 30 | 31 |
- render phase
- 3진법 뒤집기
- createbrowserrouter
- 리액트
- static pages
- dynamic pages
- sever action
- @tailwind
- 자바스크립트
- iron-session
- image component
- 프로그래머스
- SSR
- commit phase
- @tailwind utility
- @tailwind components
- interceptor routes
- supabase realtime
- sever components
- CSS
- revalidatetag
- js
- unstable_nostore
- @tailwind base
- server components
- revalidatepath
- RECOIL
- client components
- 타입스크립트
- 클로저
- Today
- Total
개발하는 너구리
TIL-24.04.26 본문
프로그래머스 3진법 뒤집기 알고리즘 문제
문제점
JS number타입의 MAX_SAFE_INTEGER를 고려하지 않은점
알고리즘 문제의 제한사항에 입력값 n은 100,000,000까지 들어올수있다고 표기되어있다. 그동안 알고리즘 문제를 풀면서 숫자크기에 대한 제한사항으로 인해 에러를 접해본적이 없기에 이걸 간과했었다
const solution = (n) => {
let ternary = n.toString(3);
let reverseTernary = Number(ternary.toString().split('').reverse().join(''));
return Number.parseInt(reverseTernary.toString().split('').reverse().join(''), 3);
};
처음 작성했던 코드
입력받은 자연수를 먼저 3진법으로 변경하고, 문자배열로 변경후 순서를 뒤집고 Number()함수를 통해 다시 숫자형으로 변경한 값이
reverseTernary라는 변수에 들어간다. 바로 여기에서 오류발생!
알아본 봐 테스트 케이스 10개중 마지막 10번 케이스는 [입력값:78413450]이라고 한다
이 값을 3진법 변화 -> 12110112211000212
순서뒤집은 숫자: 21200011221101121 -> 10진법변환 Number(21200011221101121) 바로 이 숫자가 JS의 MAX_SAFE_INTEGER 값인 9007199254740991를 초과해버려서 발생한 문제였다
시도해본것들 && 해결
문제가 왜 통과하지 못하나 계속 고민했다. 코드상 메소드들은 분명 올바르게 작성했고, 10개의 테스트중 9개는 통과했던 코드이기에
메소드들은 옳다고 생각을했다. 그러다 문득 떠오른 생각이 나 지금 숫자를 받고 숫자를 리턴하는 함수를 만들고있는거지??
그래 그럼 분명히 프로그래밍 언어가 무한한 숫자를 다 표현할것이 아니다 라는 생각이 들어 구글링해보니, 역시나 JS가 표현할수있는 숫자의 최대치가 있었던것이였다. 바로 그 점이 테스트 중 한개를 통과하지 못하게 한것이다
그렇다면 10진법이 담을수 있는 최대치를 넘지않게 하면 되지 않을까? 라는 생각에 다시 코드를 작성해보았다
let reverseTernary = Number(ternary.toString().split('').reverse().join(''));
이 코드중 reverse()가 문제였다. MAX_SAFE_INTEGER 값이 들어와 다른 진법으로 변경해도 다 표현할수있는것이지만, 이걸 reverse한 값을 변수에 넣어버리니 최대치를 넘기는 케이스가 발생해 오류가 발생한것이다..
그 점을 고려해서 다시 작성한 코드
const solution = (n) => {
return Number.parseInt(n.toString(3).split('').reverse().join(''), 3);
};
최대치는 넘어버리는 문자열을 Number()로 굳이 숫자를 만들어 오류를 발생하게 하지않고, 문자열을 바로 10진법으로 바꾸니 모든 테스트를 통과할수 있었다
알게된점
숫자를 다루는 함수를 작성할때 JS가 표현할수있는 한계를 이제는 고려해야 한다는점!
JS가 표현할수 있는 숫자의 최대값까지 다루는 일이 거의 드물어서 까맣게 잊고 코딩을 했었는데, 이렇게 잊고만 있으면 오류를 맞이하게 될수도있다!는 걸 경험했다. 자각을 준것같아 오히려 이번 알고리즘 문제에게 고맙다.
'TIL' 카테고리의 다른 글
TIL-24.04.30 (0) | 2024.04.30 |
---|---|
TIL-24.04.29 (0) | 2024.04.29 |
TIL-24.04.25 (1) | 2024.04.25 |
TIL-24.04.24 (0) | 2024.04.24 |
TIL-24.04.23 (0) | 2024.04.23 |