본문 바로가기
Coding Test/LeetCode

[Javascript] (LeetCode) 8. String to Integer (atoi) (Medium)

by Chaedie 2022. 8. 2.
728x90

 

💡 구글에 Javascript 풀이가 많이 없거나, 배운 점이 있으면 포스팅합니다.

내 풀이

/**
 * @param {string} s
 * @return {number}
 */
var myAtoi = function(s) {
  const strInfo = preTrimStr(s);
  strInfo[1] = postTrimStr(strInfo[1]);

  let sign = strInfo[0];
  let str = strInfo[1];

  let integer = strToInteger(str);  
  integer = checkOverflowAndMakeClamp(integer, sign);

  return integer * sign;
}

function checkOverflowAndMakeClamp(num, sign) {
  if (sign === 1 && num > (2 ** 31) - 1) {
    return (2 ** 31) - 1;
  } 
  if (sign === -1 && num > (2 ** 31)) {
    return (2 ** 31);
  }
  return num;
}

function strToInteger(str) {
  let integer = 0;
  for (let i = 0; i < str.length; i++) {
    let digit = 10 ** i;
    integer += str[str.length - 1 - i] * digit;
  }

  return integer;
}

function postTrimStr(s) {
  const firstNonDigitIdx = s.search(/[^0-9]/g);

  if (firstNonDigitIdx === -1) {
    return s
  } else {
    return s.slice(0, firstNonDigitIdx);
  }
}

function preTrimStr(s) {
  const str = s.trim();
  let sign = 1;
  if (str[0] === '-') {
    sign = -1;
    return [sign, str.slice(1)];
  }
  if (str[0] === '+') {
    return [sign, str.slice(1)];
  }

  return [sign, str];
}
  • 숫자 앞에 부호가 아닌 다른 모든 문자가 와도 처리해주는 방식으로 먼저 제출했었다.
  • 하지만 요구사항은 javascript의 parseInt()처럼 앞부분에 문자가 들어오면 바꿔주지 않는 로직이었다…. 요구사항 분석 한번에 하기 실패 ㅠ
  • 아무튼…
  1. preTrimStr로 앞부분 처리 (trim()으로)
  2. postTrimStr로 뒷부분 처리 (정규식, String.search()로 non-digit찾아서 slice)
  3. strToInteger에서 첫자리부터 자릿수 곱해주며 인티져로 계산
  4. checkOverFlowAndMakeClamp로 오버플로우 되었으면 클램프(최대, 최솟값으로 고정)
  5. return !

배운 점, 느낀 점

  • 1) 요구사항 분석 (문제 잘 읽기) 가 역시나 가장 중요하다. 컴퓨팅 사고, 코드 작성 능력 등을 위해 문제 풀이를 하는거지만, 결국 코테 준비도 이유 중 하나이기 때문에 시간 내에 정확하게 요구사항을 분석하고, 예외처리를 하는 등의 작업이 중요하다. 한번만에 요구사항을 제대로 분석하는 연습을 해야한다.
  • 2) 같은 문제를 (안풀려서) 코드 싹 지우고 다시 풀었더니 훨씬 깔끔한 코드가 나왔다. 지금도 엄청 깔끔한건지는 잘 모르겠지만… 첨엔 정말 노답쓰… 였기 때문에.. ㅎㅎ 리팩토링, 코드 재설계 등을 많이 해보면서 코드 작성 능력을 키우면 좋겠다는 생각을 했다.
  • 3) 확실히 내 실력에 비해 조금 까다로운 문제를 만나니 얻는게 많은것 같다. 빨리 이지 졸업하고 미디움 많이 풀어보자!!

댓글