프로그래머스 코딩테스트 연습 회고록 - 5일차

H.GOO·2022년 12월 3일
0
post-thumbnail

프로그래머스 Lev.0 "OX퀴즈"

문제 설명

문제 설명
덧셈, 뺄셈 수식들이 'X [연산자] Y = Z' 형태로 들어있는 문자열 배열 quiz 가 매개변수로 주어집니다. 수식이 옳다면 "O"를 틀리다면 "X"를 순서대로 담은 배열을 return하도록 solution 함수를 완성해주세요.

제한사항

  • 연산 기호와 숫자 사이는 항상 하나의 공백이 존재합니다. 단 음수를 표시하는 마이너스 기호와 숫자 사이에는 공백이 존재하지 않습니다.
  • 1 ≤ quiz의 길이 ≤ 10
  • X, Y, Z는 각각 0부터 9까지 숫자로 이루어진 정수를 의미하며, 각 숫자의 맨 앞에 마이너스 기호가 하나 있을 수 있고 이는 음수를 의미합니다.
  • X, Y, Z는 0을 제외하고는 0으로 시작하지 않습니다.
  • -10,000 ≤ X, Y ≤ 10,000
  • -20,000 ≤ Z ≤ 20,000
  • [연산자]는 + 와 - 중 하나입니다.

입출력 예 설명




나의 풀이

내가 생각한 알고리즘은 다음과 같다.

  1. 배열 quiz를 map 함수로 반복하여 문제를 순환한다.

  2. 각 문제에서 연산자와 a1, a2, res 항을 분리한다.

  3. 연산자에 따라 수식의 참과 거짓을 판별하여 "O", "X" 를 answer 배열에 push 한다.


const solution = (quiz) => {
  let answer = [];

  quiz.map((q) => {
    const operator = q.split(" ")[1];  // 연산자
    const a1 = Number(q.split(" ")[0]);  // 각 문제의 a1항
    const a2 = Number(q.split(" ")[2]);  // 각 문제의 a2항
    const res = Number(q.split(" ").pop());  // 각 문제의 res항

    operator === "-"  // 연산자에 따라 -/+ 계산 결과 도출
      ? answer.push(a1 - a2 === res ? "O" : "X");
      : answer.push(a1 + a2 === res ? "O" : "X");
  });

  return answer;  // 결과 반환
};



다른 사람 풀이 및 느낀점 - 1

// 출처: 프로그래머스 인영교 , 황설현 , EllaSEON 님의 풀이

const solution = (quiz) => {
  return quiz
    .map((el) => el.split(" = "))
    .map((el) => {
      return eval(el[0]) == el[1] ? "O" : "X";
    });
}

느낀점

  • eval 함수를 사용하여 문제를 풀었다.
  • eval 함수에 "2 + 2" 와 같은 문자열을 넘겨주면 문자열 "4" 를 반환해준다.
  • eval 함수를 검색해보니 사용을 지양하라는 내용이 먼저 보였다. 그 이유는 브라우저가 기계 코드에 해당 변수가 있는지 확인하고 값을 대입하기 위해 길고 무거운 변수명 검색을 수행해 속도가 느리고 caller의 권한으로 수행하는 위험한 함수 이기 때문이라고 한다.


다른 사람 풀이 및 느낀점 - 2

// 출처: 프로그래머스 Daejung Kim 님의 풀이

const solution = (quiz) => {
  return quiz.map(v => {
    const [question, answer] = v.split(" = ");
    return eval(question) == answer ? "O" : "X";
  });
}

느낀점

  • 동일하게 eval 함수를 사용하여 문제를 풀었다.
  • 하지만 개인적으로 첫 번째 풀이보다 두 번째 풀이가 더 가독성이 좋았다.
  • 배열에서 문제와 정답을 구조 분해 할당하여 둘을 비교해주니 보기 편했던 것 같다.
  • 배열에서도 구조 분해 할당이 가능한 것인지 몰랐다. 오늘도 하나 배웠다.

0개의 댓글