오늘 오전에 두 문제를 풀었는데, 오후에 알고리즘 스터디가 있어서 두 문제를 더 풀었다. 코드리뷰 하면서 배우는 것도 많은 것 같다.
처음에는 a가 무조건 b보다 작다고 생각하고 그냥 for문만 돌려서 arr 배열에 push하도록 코드를 짰었다. 그런데 코드를 실행해보니 오류가 떠서 보니 a, b 중 어떤 수가 더 크고 작은지 알 수 없었다. 그래서 if문을 추가해서 a가 더 큰 경우와 b가 더 큰 경우로 나누어서 for문을 두 번 돌렸다. 뭔가 더 간단한 방법이 있지 않을까 생각했지만, 떠오르진 않았다.
function adder(a, b, s = 0) {
for (var i = Math.min(a, b); i <= Math.max(a, b); i++) s += i;
return s;
}
Math.min
, Math.max
를 이용해서 for문 안으로 넣으니 한 줄이면 끝났다. 그리고 배열을 만들어서 push하고, reduce로 배열들의 합을 구하는 번거로운 방법이 아닌, 초기값 s=0으로 두고 s에 i를 추가하면 간단했다.
Math.min()
최소값 리턴
Math.max()
최대값 리턴
이 문제는 코드리뷰 스터디 중 조원 한 분이 풀지 못했다고 하여 조원들끼리 같이 풀어본 문제이다. 처음에는 숫자를 어떻게 배열로 바꾸어 주어야 할 지 몰라서, 결국 공식문서를 찾아봤다. split
메서드는 알고는 있었는데, 이런 상황에서 적용이 잘 안된다.
split("기준이 되는 문자")
문자열을 배열로 변환해주는 메서드const str = 'Hello World'; const words = str.split(" "); // 공백을 기준으로 나누어서 단어 단위의 배열로 반환 //[ 'Hello', 'World' ] const chars = str.split(""); // 알파벳 단위의 배열로 반환 // ['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd'] // 문장의 배열로 반환 const strCopy = str.split(); [ 'Hello World' ]
function solution(n) {
const str = String(n);
const newArr = [...str];
return newArr.reduce((acc, cur) => Number(acc) + Number(cur), 0);
}
전개연산자 사용
위 처럼 문제를 풀고 자리로 돌아왔는데, 화면 공유가 되어 있어서 조원분 중 첼린지 그룹인 분께서 코드 리뷰를 해 주셔서 수정해 보았다. 문자열을 배열로 바꾸는 방법으로 split이 아닌 전개 연산자를 사용했다. 전개연산자는 배열에서만 사용할 수 있는 줄 알았는데, 문자열에서도 사용할 수 있구나... 새로운 용법을 알게 되었다.
reduce 안에서 숫자로 변환시켜주기
그리고 map
과 reduce
가 둘 다 배열을 돌리는 함수로, 두 개를 모두 쓰는 것보다 reduce 안에서 누적값, 현재값이 출력되는 부분에서 Number()
로 숫자로 변환해주는 방법을 제시해 주었다. 좋은 방법인 것 같다.