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

엘크·2023년 9월 6일
0

programers

목록 보기
1/9
post-custom-banner

문제 설명

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

제한사항

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

입출력 예

입출력 예 설명

입출력 예 #1

본문과 동일합니다.

입출력 예 #2

10 + 20 + 30 + 40 = 100을 return 합니다.

입출력 예 #3

"10 Z 20 Z 1"에서 10 다음 Z, 20 다음 Z로 10, 20이 지워지고 1만 더하여 1을 return 합니다.

입출력 예 #4, #5

설명 생략

내가 풀은 답

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

  for (const num of s.split(" ")) {
      if (num === "Z") {
          answer.pop();
      } else {
          answer.push(+num)
      }
  }
  return answer.reduce((a,b) => a + b, 0);
}

더 괜찮은 답은 없었을까?

function solution(s) {
    s = s.split(" ")
    // Z가 있다면, 이전것과 같이 삭제
    while(s.includes('Z')) {
        s.splice(s.indexOf('Z')-1,2)
    }
    return s.reduce((a,b) => a+Number(b), 0)
}

왜 이렇게 생각했나요?

  1. Z가 나오면 뒤의 원소 - 앞의 원소. 지만, 나오지 않으면 그냥 다 더하고 끝이야.
  2. Z가 여러개 나올 수도 있다. 그치만 연속은 아니다.
  3. 배열에다가 함수0 함수[2]하는걸 생각해봤을때, 함수[1]값을 따로 빼내주면 되는게 아닌가? 하고 생각했다.

풀이 과정.

  1. 빈 배열 answer를 먼저 만들어준다.
  2. 지정되어 있는 문자열 s를 split함수를 이용하여 " " 로 분할해주고
  3. 그다음 for...of 를 사용하여 반복처리해준다. 여기서 num은 현재 요소를 의미한다.
  4. 그 후 num === z(기호인가?) 인가를 파악하고, 맞으면 pop(없애고), 틀리면 +num을 통해 숫자로 변환하고, 숫자를 푸시한다.
  5. 완성되고 나선 reduce() 함수를 이용하여 모든 숫자요소의 합계를 더한다.
  6. profit!

후기.

생각보다 어려운 문제였다. 2번까지는 잘 생각해냈는데, 4번 과정을 손으로 옮기는 과정이 어려웠다. 이거랑 비슷한 문제가 있었던 것 같은데?

profile
꾸준하게 하면 된다 언젠가는..?
post-custom-banner

0개의 댓글