<문제 설명>
숫자와 "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에 각 값을 더해주는 반복문을 만들었다.
<코멘트>
===과 =의 차이를 확실하게 알아가고 있는 것 같다.
템플릿 리터럴을 먼저 생각해서 써본 것은 처음이였고, 너무 편했다.
새롭게 알아가는 것은 없었지만 내장함수에 아주 조금은 익숙해져 가는 것 같다.
'개발 > 코딩테스트' 카테고리의 다른 글
[프로그래머스 | JavaScript] 겹치는 선분의 길이 (0) | 2023.04.14 |
---|---|
[프로그래머스 | JavaScript] 평행 (0) | 2023.04.13 |
[프로그래머스 | JavaScript] 저주의 숫자 3 (0) | 2023.04.12 |
[프로그래머스 | JavaScript] 치킨 쿠폰 (0) | 2023.04.11 |
[프로그래머스 | JavaScript] 공던지기 (0) | 2023.04.10 |