🧑💻 언어 및 제출 결과
- 사용 언어:
JavaScript
- 통과 여부: ✅
🧠 풀이 설명
문제에서 제시된 조건을 추려봤읍니다.
- 공백: 앞쪽 공백 무시
- 부호: '-' 또는 '+' 확인, 없으면 양수
- 변환: 숫자 아닌 문자 나올 때까지 읽기, 숫자 없으면 0
- 범위: [-2³¹, 2³¹-1] 벗어나면 경계값으로 고정
parseInt()
가 조건 1~3을 자동 처리, 추가로 32비트 정수 범위만 체크comma oprerator
를 사용하여 32비트 조건 해결
전체코드
const myAtoi = s => (
(num = parseInt(s)),
(_32Bit = Math.pow(2, 31)),
isNaN(num) ? 0 : num < -_32Bit ? -_32Bit : num > _32Bit - 1 ? _32Bit - 1 : num
);
📊 시간/공간 복잡도
- 시간 복잡도:
O(n)
- 공간 복잡도:
O(1)
📝 추가 설명 (선택)
이 문제를 추천했던 의도는 atoi
함수를 직접 만드는 것이었는데 진행하다보니 parseInt
에서도 atoi
함수랑 다른 것이 거의 없더군요...
그래서 C언어의 atoi
함수와 어떤 차이점이 비교해봤습니다.
1. 함수 시그니처
// C언어
int atoi(const char *str); // 반환값: int, 매개변수: 문자열 포인터
parseInt(string, radix) // 반환값: Number, 매개변수: 문자열, 진법(선택)
2. 오류 처리
// C언어 - 오류 감지 불가능
atoi("abc") // 0 (오류인지 실제 0인지 구분 불가)
atoi("123abc") // 123 (부분 파싱)
atoi("") // 0
atoi(NULL) // Segmentation Fault (크래시)
// JavaScript - NaN으로 오류 표시
parseInt("abc") // NaN (명확한 오류)
parseInt("123abc") // 123 (부분 파싱)
parseInt("") // NaN
parseInt(null) // NaN
3. 범위 처리
// C언어 - int 범위 초과 시 undefined behavior
atoi("2147483648") // 구현에 따라 다름 (보통 -2147483648 또는 쓰레기값)
atoi("-2147483649") // 구현에 따라 다름
// JavaScript - Number 범위까지 정확히 처리
parseInt("2147483648") // 2147483648 (정확)
parseInt("-2147483649") // -2147483649 (정확)
4. 공백 처리
// C언어 - 앞쪽 공백만 무시
atoi(" 123") // 123
atoi("123 ") // 123
atoi("1 23") // 1 (공백 만나면 중단)
// JavaScript - 앞쪽 공백만 무시 (C와 유사)
parseInt(" 123") // 123
parseInt("123 ") // 123
parseInt("1 23") // 1
5. 부호 처리
// C언어
atoi("+123") // 123
atoi("-123") // -123
atoi("+-123") // 0 (잘못된 형태)
atoi("+") // 0
atoi("-") // 0
// JavaScript
parseInt("+123") // 123
parseInt("-123") // -123
parseInt("+-123") // NaN (더 엄격)
parseInt("+") // NaN
parseInt("-") // NaN
6. 진법 지원
// C언어 - 10진법만 지원
atoi("0xFF") // 0 (16진법 인식 안함)
atoi("1010") // 1010 (2진법 아닌 10진법으로)
// JavaScript - 다양한 진법 지원
parseInt("0xFF") // 255 (자동 16진법 인식)
parseInt("1010", 2) // 10 (명시적 2진법)
parseInt("77", 8) // 63 (8진법)
7. 문자열 길이 제한
// C언어 - 메모리 안전성 없음
char *longStr = malloc(SIZE_MAX);
atoi(longStr); // 잠재적 버퍼 오버플로우
// JavaScript - 메모리 안전
let longStr = "1".repeat(1000000);
parseInt(longStr); // 안전하게 처리
8. 성능
// C언어 - 네이티브 코드, 매우 빠름
// 간단한 구현:
// while (*str >= '0' && *str <= '9') {
// result = result * 10 + (*str - '0');
// str++;
// }
// JavaScript - 인터프리터/JIT, 상대적으로 느림
// 하지만 더 많은 기능 제공
// - 타입 변환
// - 진법 처리
// - 유니코드 지원
// - NaN 처리
// - Number 타입 범위 확인
크리티컬한 차이점
오버플로우 동작
// C언어 - 예측 불가능
printf("%d\n", atoi("999999999999999999")); // ?????
// JavaScript - 예측 가능
console.log(parseInt("999999999999999999")); // 1000000000000000000
메모리 안정성
// C언어 - 위험
atoi(NULL); // 크래시
atoi(malformed_ptr); // 크래시
// JavaScript - 안전
parseInt(null); // NaN
parseInt(undefined); // NaN
C의 atoi는 빠르지만 위험하고 기능이 제한적이고, parseInt는 안전하고 기능이 풍부하지만 상대적으로 느릴 수 있다고 합니다.
그렇다고 js에서 atoi를 직접 만드는 경우가 없진 않습니다! 저 같은 경우는 사용자가 input 입력 시에 실시간으로 parseInt로 변환할 때 사이드 이펙트가 자주 일어나더군요 핸드폰 번호 입력할 때 010
부분에서 자동으로 0을 지운다거나,
parseInt("") // NaN
parseInt(" ") // NaN
parseInt("0") // 0
어떤 게 비어있는지 어떤 게 "0"인지 애매한 상황도 나온다거나...
그러니 한번씩 직접 parseInt를 구현해보는 것도 좋을 것 같습니다~~
'코딩테스트 > LeetCode' 카테고리의 다른 글
[LeetCode] Delete Node in a Linked List (연결 리스트) (1) | 2025.07.09 |
---|---|
[LeetCode] Implement strStr() (3) | 2025.07.09 |
[LeetCode] Valid Anagram (1) | 2025.07.08 |
[LeetCode] First unique character in a string (0) | 2025.07.07 |
[LeetCode] Valid Palindrome (팰린드롬) (0) | 2025.07.07 |