개발/코딩테스트

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

prpn97 2023. 4. 8. 23:15

<문제 설명>


숫자와 "Z"가 공백으로 구분되어 담긴 문자열이 주어집니다. 

문자열에 있는 숫자를 차례대로 더하려고 합니다. 

이 때 "Z"가 나오면 바로 전에 더했던 숫자를 뺀다는 뜻입니다. 

숫자와 "Z"로 이루어진 문자열 s가 주어질 때, 

머쓱이가 구한 값을 return 하도록 solution 함수를 완성해보세요.

 

<입출력 예>

s result
"1 2 Z 3" 4
"10 20 30 40" 100
"10 Z 20 Z 1" 1
"10 Z 20 Z" 0
"-1 -2 -3 Z"  3

<문제 풀이>

function solution(s) {
    var answer = 0;
    var result = 0;
    answer = s.split(' ')
    for(let i = 0; i < answer.length; i++){
        if(answer[i]==="Z"){
            answer[i]=(`-${answer[i-1]}`)
        }
    }
    for(let j = 0; j < answer.length; j++){
        if( answer[j][1]==='-'){
            answer[j]='+'+answer[j].slice(2)
        }
    }
   let num = answer.map(Number)
    for ( let i = 0; i < num.length; i++){
        result = result+num[i]
    }
    return result
}

 

먼저 s는 공백을 기준으로 나뉘어져 있으므로 split을 통해 값을 구분했다. 

그리고 각 요소들을 반복문을 통해 검사해서 answer[i]이 "Z"일 경우

answer[i]값을 i값의 바로 직전 값인 i-1값으로 갱신했고, 각 값을 더하는 것인데

Z는 직전 값을 다시 빼야 하므로 갱신할때 '-'를 추가하여 

Z가 나오면 직전 숫자를 빼도록 했다. 

템플릿 리터럴을 사용하여 문자열로 사용하지만 그 안에 변수를 넣어서 사용할 수 있었다.

 

이제 Z는 없고 숫자만 있기 때문에 각 값을 다 더하면 끝날 것이라 생각했지만,

Z를 '-[i-1]'로 바꿨으니 i-1이 음수가 나올 경우

-3이 나와야 할 때 --3이 나와버려서 올바른 값이 출력되지 않았다. 

-3을 취소하려면 다시 3을 더해줘야 하기 때문에 --을 +로 만들어야 했다.

 

그래서 중간에 있는 for문은 각 요소의 2번째 글자가 '-'일 경우 위에 갱신한 것처럼 값을 갱신했다. 

맨앞에 '+'를 넣고, 값을 넣을 때 slice(2)를 이용하여 2번째 인덱스부터 끝까지의 값을 넣었다. 

즉, --31일 경우 '+'와 2번째 인덱스 부터 끝까지의 값인 31을 넣어서 +31이 된 것이다. 

 

그리고 맨 밑에는 각 요소들이 문자열로 되어 있기 때문에 map으로 숫자로 바꿔주었고, 

0으로 초기화 되어 있는 result에 각 값을 더해주는 반복문을 만들었다. 

 

<코멘트>

 

===과 =의 차이를 확실하게 알아가고 있는 것 같다.

템플릿 리터럴을 먼저 생각해서 써본 것은 처음이였고, 너무 편했다. 

새롭게 알아가는 것은 없었지만 내장함수에 아주 조금은 익숙해져 가는 것 같다.

728x90