[프로그래머스] 컨트롤 제트

이아현·2023년 6월 5일
0

코딩테스트

목록 보기
11/31
post-thumbnail

✅ 문제 설명

숫자와 "Z"가 공백으로 구분되어 담긴 문자열이 주어집니다. 문자열에 있는 숫자를 차례대로 더하려고 합니다. 이 때 "Z"가 나오면 바로 전에 더했던 숫자를 뺀다는 뜻입니다. 숫자와 "Z"로 이루어진 문자열 s가 주어질 때, 머쓱이가 구한 값을 return 하도록 solution 함수를 완성해보세요.

✅ 제한 사항

  • 1 ≤ s의 길이 ≤ 200
  • -1,000 < s의 원소 중 숫자 < 1,000
  • s는 숫자, "Z", 공백으로 이루어져 있습니다.
  • s에 있는 숫자와 "Z"는 서로 공백으로 구분됩니다.
  • 연속된 공백은 주어지지 않습니다.
  • 0을 제외하고는 0으로 시작하는 숫자는 없습니다.
  • s는 "Z"로 시작하지 않습니다.
  • s의 시작과 끝에는 공백이 없습니다.
  • "Z"가 연속해서 나오는 경우는 없습니다.

👩‍💻 나의 풀이

function solution(s) {
  var lst = s.split(" ");
  var sum = 0;

  for (let i = 0; i < lst.length; i++) {
    if (lst[i] != "Z") {
      sum += Number(lst[i]);
    } else {
      sum -= Number(lst[i - 1]);
    }
  }
  return sum;
}
console.log(solution("1 2 Z 3"));
  • 이번 문제는 그렇게 어렵게 풀지 않았다.

📃 다른 풀이

function solution(s) {
  const stack = [];

  s.split(" ").forEach((target) => {
    if (target === "Z") stack.pop();
    else stack.push(+target);
  });

  // reduce : 배열의 각 요소에 대해 주어진 reducer 함수를 실행하고 하나의 결과값을 반환
  // accumulator : 누산기
  // currentValue : 현재 값
  return stack.length ? stack.reduce((accumulator, currentValue) => accumulator + currentValue) : 0;
}
console.log(solution("1 2 Z 3"));
  • 조금 더 효율적인 코드를 찾아보다가 stack 자료구조와 forEach, reduce메서드를 사용하여 더욱 간략하고 가독성있는 코드를 발견했다.
  • 자바스크립트에서 +연산자는 피연산자를 숫자로 변환하는 용도로 사용된다.
    • +targettarget문자열을 숫자로 변환한 값이고
    • stack.push(target)을 하면 stack에 문자열이 추가되는 것을 의미한다.
    • 그렇기 때문에 target앞에 +연산자를 붙여 숫자로 바꿔준다.
profile
PM을 지향하는 FE 개발자 이아현입니다 :)

0개의 댓글