[코딩테스트] OX 퀴즈

windowook·2023년 12월 30일
post-thumbnail

🌱 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
  • [연산자]는 + 와 - 중 하나입니다.

나의 풀이

function solution(quiz) {
    const answer = [];
    for (let i = 0; i < quiz.length; i++) {
        let expression = quiz[i];
        const arr = expression.split(' '); 
        const xyz = arr.map(v => parseInt(v));
        let result;

        // [연산자] 판단
        if (arr[1] === '-') {
            result = xyz[0] - xyz[2];
        } else if (arr[1] === '+') {
            result = xyz[0] + xyz[2];
        }

        // X, Y를 계산한 값과 Z가 맞는지 비교
        result === xyz[4] ? answer.push('O') : answer.push('X');
    }
    
    return answer;
}

로직 설명
quiz 배열의 i번째 식을 배열로 바꾼 뒤, 배열 안의 문자를 숫자로 변환하고
첫 번째 숫자 xyz[0] X와 xyz[2] Y를 계산한 값 result를 구해서
xyz[4], 즉 i번째 식에 들어있던 결과값인 Z와 비교하여 OX를 answer에 push했습니다.

다른 사람의 풀이 Best

function solution(quiz) {
    var answer = [];
    return quiz.map(t => {
        const [calc, result] = t.split(' = ');
        const sign = calc.includes('+') ? 1 : -1
        const [a, b] = calc.split(sign === 1 ? ' + ' : ' - ');

        return +a + (+b * sign) === +result ? 'O' : 'X'
    });
}

map을 사용하여 풀 수 있는 문제였습니다.

quiz 배열 안의 문자열 t를 ' = ' 기준으로 계산 부분과 결과 부분을 나누어서
계산 부분 안에 연산자를 판단하여 a(X), b(Y)를 계산하고 result와 비교한 값을
삼항연산자를 이용해 O,X를 반환하네요.

b는 어차피 연산자 sign에 의해 음수인지 양수인지 정해지므로 곱해도 되는 것을 저는 생각하지 못했습니다.

profile
안녕하세요

0개의 댓글