문제(출처: 프로그래머스)

덧셈, 뺄셈 수식들이 '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) {
    var answer = [];
    quiz.forEach((v) =>{
        let equation = v.split(' ');
        if(equation[1] === "-"){
            let result = Number(equation[0]) - Number(equation[2]);
            if (result === Number(equation[4])){
                answer.push("O")
            }
            else answer.push("X")
        }
        if(equation[1] === "+"){
            let result = Number(equation[0]) + Number(equation[2]);
            if (result === Number(equation[4])){
                answer.push("O")
            }
            else answer.push("X")     
        }
    })
    return answer;
}

 

 다른 유저가 푼 방식

// 유저 1
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'
    });
}

// 유저 2
function solution(quiz) {
    let answer = [];
    quiz.forEach((val) => {
        const [x, sign, y, , z] = val.split(" ");
        let sum = 0;
        if (sign === "+") {
            sum = Number(x) + Number(y);
        } else {
            sum = Number(x) - Number(y);
        }
        sum === Number(z) ? answer.push("O") : answer.push("X");
    });
    return answer;
}

// 유저 3

 

 배운 것들

     -  split 을 한 후 구조분해를 하면 코드가 좀더 간결해진다.

     - 

문제(출처: 프로그래머스)

my_string은 "3 + 5"처럼 문자열로 된 수식입니다. 문자열 my_string이 매개변수로 주어질 때, 수식을 계산한 값을 return 하는 solution 함수를 완성해주세요.

 

제한사항

  • 연산자는 +, -만 존재합니다.
  • 문자열의 시작과 끝에는 공백이 없습니다.
  • 0으로 시작하는 숫자는 주어지지 않습니다.
  • 잘못된 수식은 주어지지 않습니다.
  • 5 ≤ my_string의 길이 ≤ 100
  • my_string을 계산한 결과값은 1 이상 100,000 이하입니다.
    • my_string의 중간 계산 값은 -100,000 이상 100,000 이하입니다.
    • 계산에 사용하는 숫자는 1 이상 20,000 이하인 자연수입니다.
    • my_string에는 연산자가 적어도 하나 포함되어 있습니다.
  • return type 은 정수형입니다.
  • my_string의 숫자와 연산자는 공백 하나로 구분되어 있습니다.

▶ 내가 푼 방식

function solution(my_string) {
    let my_number = my_string.split(' ');
    let answer =0
    answer += Number(my_number[0]);
    my_number.forEach((v, i) => {
        if (my_number[i+1] === "+"){
            answer += Number(my_number[i+2]);
        }
        if (my_number[i+1] === "-"){
            answer -= Number(my_number[i+2]);
        }
    })
    return answer;
}

 

 다른 유저가 푼 방식

// 유저 1
function solution(my_string) {
    const stack = [];

    let sign = 1;
    for (const ch of my_string.split(" ")) {
        if (ch === "+") {
            sign = 1;
        } else if (ch === "-") {
            sign = -1;
        } else {
            stack.push(ch * sign);
        }
    }

    return stack.reduce((a,b) => a + b, 0);
}

 

'프로그래밍 > 코딩연습' 카테고리의 다른 글

[ JS 코딩연습 ] 7의 개수  (0) 2024.05.15
[ JS 코딩연습 ] OX 퀴즈  (0) 2024.05.13
[ JS 코딩연습 ] 영어가 싫어요  (0) 2024.05.12
[JS 코딩연습] 369 게임  (0) 2024.05.11
[ JS 코딩연습 ] 가까운 수  (0) 2024.05.11

문제(출처: 프로그래머스)

영어가 싫은 머쓱이는 영어로 표기되어있는 숫자를 수로 바꾸려고 합니다. 문자열 numbers가 매개변수로 주어질 때, numbers를 정수로 바꿔 return 하도록 solution 함수를 완성해 주세요.

 

제한사항

  • numbers는 소문자로만 구성되어 있습니다.
  • numbers는 "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" 들이 공백 없이 조합되어 있습니다.
  • 1 ≤ numbers의 길이 ≤ 50
  • "zero"는 numbers의 맨 앞에 올 수 없습니다.

▶ 내가 푼 방식

const stringToNumber = {
    "zero": 0,
    "one" : 1,
    "two": 2,
    "three": 3,
    "four" : 4, 
    "five" : 5,
    "six" :6 , 
    "seven" : 7, 
    "eight" : 8, 
    "nine" :9  
}

function solution(numbers) {
    var answer = [];
    var temp = ''
    for (let i of numbers){
        temp += i
        if(stringToNumber[temp] === 0 | stringToNumber[temp] ){
            answer.push(stringToNumber[temp])
            temp = ''
        }
    }
    return Number(answer.join(''))
}

 

 다른 유저가 푼 방식

// 유저 1
function solution(numbers) {
    const obj = {
        zero: 0, one: 1, two: 2, three: 3, four: 4,
        five: 5, six: 6, seven: 7, eight: 8, nine: 9
    };

    const num = numbers.replace(/zero|one|two|three|four|five|six|seven|eight|nine/g, (v) => {
        return obj[v];
    });

    return Number(num);
}

// 유저 2
function solution(numbers) {
    let numStr = [ "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" ];
	
    // zero 라는 문자를 가진 모든 문자를 idx(0) 으로 변경
    numStr.forEach((str, idx) => {
        numbers = numbers.replaceAll(str, idx);
    });
    return Number(numbers);
}

// 유저 3
function solution(numbers) {
    let d = ['zero', 'one','two','three','four','five','six','seven','eight','nine'];
    for (let i in d) numbers = numbers.replace(new RegExp(d[i], 'g'), +i);
    return +numbers;
}

 

 배운 것들

     -  replace의 새로운 사용방법

     -  만약에 const number = '1234' ->  +number 하면 1234 가 출력된다.   

문제(출처: 프로그래머스)

머쓱이는 친구들과 369게임을 하고 있습니다. 369게임은 1부터 숫자를 하나씩 대며 3, 6, 9가 들어가는 숫자는 숫자 대신 3, 6, 9의 개수만큼 박수를 치는 게임입니다. 머쓱이가 말해야하는 숫자 order가 매개변수로 주어질 때, 머쓱이가 쳐야할 박수 횟수를 return 하도록 solution 함수를 완성해보세요.

 

제한사항
1 ≤ order ≤ 1,000,000

 

▶ 내가 푼 방식

function solution(order) {
    let strings = String(order)
    let numberArray = Array.from(strings)
    return numberArray.filter(v => (v%3 === 0 && v!=0) ).length
}

 

 다른 유저가 푼 방식

// 유저 1
function solution(order) {
    var answer = [...order.toString().matchAll(/[3|6|9]/g)].length;
    return answer;
}

// 유저 2
function solution(order) {
    const mySet = new Set([3,6,9]);
    return String(order).split('')
                        .filter(num => mySet.has(Number(num)))
                        .length;
}

// 유저 3
function solution(order) {
    return (order + '').replace(/[0,1,2,4,5,7,8]/g, '').length
}
function solution(order) {
    return (order + '').replace(^/[3,6,9]/g, '').length
}

 

 배운 것들

     -  순서에서 10, 1000 과 같이 0이 들어간 경우를 생각하지 못하여서 시간이 걸렸다.

     - matchAllset/ Has 를 이용하여서 푸는 방식도 있다. 이걸 사용하면 0을 생각할 필요가 없어진다.

     - 정규표현식으로 하는 사람도 있었다.

문제(출처: 프로그래머스)

정수 배열 array와 정수 n이 매개변수로 주어질 때, array에 들어있는 정수 중 n과 가장 가까운 수를 return 하도록 solution 함수를 완성해주세요.

 

제한사항

  • 1 ≤ array의 길이 ≤ 100
  • 1 ≤ array의 원소 ≤ 100
  • 1 ≤ n ≤ 100
  • 가장 가까운 수가 여러 개일 경우 더 작은 수를 return 합니다.

▶ 내가 푼 방식

function solution(array, n) {
    var difference = [];
    array.sort()
    array.map(value => difference.push(Math.abs(n-value)))
    const min = Math.min(...difference)
    return array[difference.indexOf(min)];
}

 

 다른 유저가 푼 방식

// 유저 1
function solution(array, n) {
    array.sort((a,b) => Math.abs(n - a) - Math.abs(n - b) || a - b);

    return array[0];
}

 

 배운 것들

     -  sort 를 새로운 방식으로 정렬

     - 

+ Recent posts