본문 바로가기

LeetCode

640. Solve the Equation / TypeScript

Solve a given equation and return the value of 'x' in the form of a string "x=#value". The equation contains only '+', '-' operation, the variable 'x' and its coefficient. You should return "No solution" if there is no solution for the equation, or "Infinite solutions" if there are infinite solutions for the equation.

If there is exactly one solution for the equation, we ensure that the value of 'x' is an integer.

 

Example 1:

Input: equation = "x+5-3+x=6+x-2"
Output: "x=2"

Example 2:

Input: equation = "x=x"
Output: "Infinite solutions"

Example 3:

Input: equation = "2x=x"
Output: "x=0"

 

출처 : https://leetcode.com/problems/solve-the-equation/description/

 

 

풀이

function solveEquation(equation: string): string {
  let tmp: number = 0,
    lr: number = 1,
    a: number = 0,
    b: number = 0,
    sign: number = 1,
    calc: number = 0;

  for (let i = 0; i < equation.length; i++) {
    if (equation[i] >= "0" && equation[i] <= "9") {
      tmp = tmp * 10 + +equation[i];
      calc++;
    }
    if (equation[i] === "x") {
      if (tmp === 0 && calc === 0) a += sign * lr;
      a += sign * lr * tmp;
      calc = tmp = 0;
    }
    if (
      equation[i] === "-" ||
      equation[i] === "+" ||
      equation[i] === "=" ||
      equation[i + 1] === undefined
    ) {
      b += sign * lr * tmp;
      calc = tmp = 0;
      if (equation[i] === "-") {
        sign = -1;
      } else if (equation[i] === "+") {
        sign = 1;
      } else if (equation[i] === "=") {
        lr = -1;
        sign = 1;
      }
    }
  }
  if (a !== 0) return `x=${-b / a}`;

  if (a === 0) {
    if (b === 0) return "Infinite solutions";
    else return "No solution";
  }
}

 

일차 방정식(1차 방정식)을 문자열 형태로 입력받아 이를 해결하는 함수

 

  • tmp: 현재 숫자를 저장하는 임시 변수.
  • lr: 왼쪽과 오른쪽 부분을 구분하는 변수. 초기값은 1이며, = 이후 오른쪽 부분에서는 -1
  • a: x의 계수를 저장하는 변수.
  • b: 상수항을 저장하는 변수.
  • sign: 현재 숫자의 부호를 저장하는 변수. 초기값은 1 (양수).
  • calc: 숫자가 있는지 확인하는 변수.

 

예제 1: "2x+3=5"

초기 상태:

  • tmp = 0
  • lr = 1
  • a = 0
  • b = 0
  • sign = 1
  • calc = 0

방정식 순회:

  1. 문자 '2' (i=0):
    • 숫자이므로 tmp = 2
    • calc = 1 (숫자가 있음을 표시)
  2. 문자 'x' (i=1):
    • a += sign * lr * tmp -> a += 1 * 1 * 2 -> a = 2 (계수 a에 2를 더함)
    • tmp = 0 (임시 저장소 초기화)
    • calc = 0 (숫자 여부 초기화)
  3. 문자 '+' (i=2):
    • b += sign * lr * tmp -> b += 1 * 1 * 0 -> b = 0 (상수항 b에 0을 더함)
    • sign = 1 (부호 설정, 이미 양수지만 명시적으로 유지)
  4. 문자 '3' (i=3):
    • 숫자이므로 tmp = 3
    • calc = 1 (숫자가 있음을 표시)
  5. 문자 '=' (i=4):
    • b += sign * lr * tmp -> b += 1 * 1 * 3 -> b = 3 (상수항 b에 3을 더함)
    • tmp = 0 (임시 저장소 초기화)
    • calc = 0 (숫자 여부 초기화)
    • lr = -1 (오른쪽 부분으로 이동)
    • sign = 1 (부호를 양수로 초기화)
  6. 문자 '5' (i=5):
    • 숫자이므로 tmp = 5
    • calc = 1 (숫자가 있음을 표시)
  7. 문자열 끝:
    • b += sign * lr * tmp -> b += 1 * -1 * 5 -> b = -2 (상수항 b에 -5를 더함)

결과 계산:

  • a = 2
  • b = -2
  • a가 0이 아니므로, x = -b / a -> x = -(-2) / 2 -> x = 1
  • 결과: "x=1"

예제 2: "x+5=x+2"

초기 상태:

  • tmp = 0
  • lr = 1
  • a = 0
  • b = 0
  • sign = 1
  • calc = 0

방정식 순회:

  1. 문자 'x' (i=0):
    • a += sign * lr * tmp -> a += 1 * 1 * 0 -> a = 1 (x의 계수 a에 1을 더함, 기본 1)
    • tmp = 0 (임시 저장소 초기화)
    • calc = 0 (숫자 여부 초기화)
  2. 문자 '+' (i=1):
    • b += sign * lr * tmp -> b += 1 * 1 * 0 -> b = 0 (상수항 b에 0을 더함)
    • sign = 1 (부호 설정, 이미 양수지만 명시적으로 유지)
  3. 문자 '5' (i=2):
    • 숫자이므로 tmp = 5
    • calc = 1 (숫자가 있음을 표시)
  4. 문자 '=' (i=3):
    • b += sign * lr * tmp -> b += 1 * 1 * 5 -> b = 5 (상수항 b에 5를 더함)
    • tmp = 0 (임시 저장소 초기화)
    • calc = 0 (숫자 여부 초기화)
    • lr = -1 (오른쪽 부분으로 이동)
    • sign = 1 (부호를 양수로 초기화)
  5. 문자 'x' (i=4):
    • a += sign * lr * tmp -> a += 1 * -1 * 0 -> a = 0 (x의 계수 a에 -1을 더함, 기본 1)
    • tmp = 0 (임시 저장소 초기화)
    • calc = 0 (숫자 여부 초기화)
  6. 문자 '+' (i=5):
    • b += sign * lr * tmp -> b += 1 * -1 * 0 -> b = 5 (상수항 b에 0을 더함)
    • sign = 1 (부호 설정, 이미 양수지만 명시적으로 유지)
  7. 문자 '2' (i=6):
    • 숫자이므로 tmp = 2
    • calc = 1 (숫자가 있음을 표시)
  8. 문자열 끝:
    • b += sign * lr * tmp -> b += 1 * -1 * 2 -> b = 3 (상수항 b에 -2를 더함)

결과 계산:

  • a = 0
  • b = 3
  • a가 0이고 b도 0이 아니므로 결과: "No solution"

예제 3: "x=x"

초기 상태:

  • tmp = 0
  • lr = 1
  • a = 0
  • b = 0
  • sign = 1
  • calc = 0

방정식 순회:

  1. 문자 'x' (i=0):
    • a += sign * lr * tmp -> a += 1 * 1 * 0 -> a = 1 (x의 계수 a에 1을 더함, 기본 1)
    • tmp = 0 (임시 저장소 초기화)
    • calc = 0 (숫자 여부 초기화)
  2. 문자 '=' (i=1):
    • b += sign * lr * tmp -> b += 1 * 1 * 0 -> b = 0 (상수항 b에 0을 더함)
    • tmp = 0 (임시 저장소 초기화)
    • calc = 0 (숫자 여부 초기화)
    • lr = -1 (오른쪽 부분으로 이동)
    • sign = 1 (부호를 양수로 초기화)
  3. 문자 'x' (i=2):
    • a += sign * lr * tmp -> a += 1 * -1 * 0 -> a = 0 (x의 계수 a에 -1을 더함, 기본 1)
    • tmp = 0 (임시 저장소 초기화)
    • calc = 0 (숫자 여부 초기화)
  4. 문자열 끝:
    • b += sign * lr * tmp -> b += 1 * -1 * 0 -> b = 0 (상수항 b에 0을 더함)

결과 계산:

  • a = 0
  • b = 0
  • a가 0이고 b도 0이므로 결과: "Infinite solutions"