문제 설명
정수 n과 문자열 control이 주어집니다. control은 'w', 'a', 's', 'd'의 4개의 문자로 이루어져 있으며, control의 앞에서부터 순서대로 문자에 따라 n의 값을 바꿉니다.
- "w" : n이 1 커집니다.
- "s" : n이 1 작아집니다.
- "d" : n이 10 커집니다.
- "a" : n이 10 작아집니다.
위 규칙에 따라 n을 바꿨을 때 가장 마지막에 나오는 n의 값을 return하는 solution 함수를 완성해 주세요.
제한 사항
- -100,000 ≤ n ≤ 100,000
- 1 ≤ control의 길이 ≤ 100,000
- control은 알파벳 소문자 "w", "a", "s", "d"로 이루어진 문자열입니다.
입출력 예
n | control | result |
0 | "wsdawsdassw" | -1 |
입출력 예 설명
입출력 예 #1
- 수 n은 control에 따라 다음과 같은 순서로 변하게 됩니다.
- 0 → 1 → 0 → 10 → 0 → 1 → 0 → 10 → 0 → -1 → -2 → -1
- 따라서 -1을 return 합니다.
나의 문제 풀이
function solution(n, control) {
var answer = 0;
for (let i = 0; i < control.length; i++){
if (control[i] === 'w'){
n++;
} else if (control[i] === 's'){
n--;
} else if (control[i] === 'd'){
n += 10;
} else if (control[i] === 'a'){
n -= 10;
}
}
answer = n;
return answer;
}
for문을 돌면서 if 문으로 조건을 다 걸어주었는데,
조금 더 깔끔하게 작성할 수 없을까 하는 생각이 들어서 다른 분들의 답안들을 확인해봤다.
그 중에서 가장 나의 깔끔하고 길이에만 치우치지 않은 듯한 코드를 발견했다.
const operations = {
w: (n) => n + 1,
s: (n) => n - 1,
d: (n) => n + 10,
a: (n) => n - 10,
};
function solution(n, control) {
return [...control].reduce((prev, op) => operations[op](prev), n);
}
operations 객체에 각 프로퍼티에 동작해야하는 것들을 함수형태로 넣어준 것은 이해했다.
하지만 reduce 메서드에 대한 활용법을 몰랐던 나는, solution 함수를 쉽게 이해할 수 없었다.
그래서 하나하나 분해해서 이해해보기로 했다.
[...control]
: 문자열 형태의 control을 스프레드 문법을 통해서 배열에 넣어준다.
이렇게 해주면 control은 아래와 같은 형태로 변환된다.
[ 'w', 's', 'd', 'a', 'w', 's', 'd', 'a', 's', 's', 'w' ]
reduce
: 대망의 reduce, 나는 이 메서드를 사용해본 적이 없다. 강의해서 딱 한 번 들었는데, 도통 사용해볼 생각이 잘 들지 않았다.
하지만, 이번에 한 번 제대로 이해해보고 필요할 때 꺼내서 쓸 수 있을 정도의 이해력을 갖춰보자는 생각을 했기 때문에 자세히 한 번 정리해보려고 한다.
reduce는 배열 메서드이기 때문에 위에서 처럼 배열 형태로 전환해준 듯 하다.
reduce는 4개의 인자를 가진다.
- 누산기 (acc)
- 현재 값 (cur)
- 현재 인덱스 (idx)
- 원본 배열 (src)
reduce 함수의 반환 값은 누산기에 할당되고, 누산기는 순회 중 유지됨으로 결국 최종 결과는 하나의 값이 된다.
위의 함수에서 누산기는 prev일 것이고 op는 배열로 변환 된 control의 한 값일 것이다.
operations[op](prev)
operations의 w,s,a,d 중 하나의 메서드가 prev에 따라서 들어가게 될 것이고, n의 초기값이 initialValue로 들어가서 계산이 되는 것이다.
그렇게 control 배열대로 순환이 될 것이고, 그 값들이 차례대로 누산기로 들어가 return 되어 답을 도출할 것이다.
예제 없이 reduce를 이해하려고 했더니, 조금 막연하고 이해가 잘 가지 않아서 함께 스터디하는 분의 설명을 토대로 이해하게 되었다.
문제풀이 소감
실제 코드를 짤 때 reduce를 활용할 생각 자체를 안하게 되는데, for 문으로 코테를 풀다가도 reduce로 대체가 될 것 같은 상황이라면 한 번 대체해서도 풀어보려고 한다.
한 번 이해하고 사용할 수 있을 정도이면, 사용하지 않더라도 언제든 필요할 때 떠올리고 사용할 수 있을 것이라 생각하기 때문이다.
0단계 문제를 풀 때, 한 없이 빠르게 풀다가도 (양치기 같은 느낌) 이런 문제를 하나 만나서 새로운 개념을 배우고 정리하는 시간이 오래 걸리기도 하는 것 같다.
빠르게 0단계를 탈출하기 위해 화이팅 해보자!