다음과 같은 정수 배열을 생성하는 range 함수를 구현하시오.
const assert = require('assert'); const range = (start, end, step) => {}; assert.deepStrictEqual(range(1, 10, 1), [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); assert.deepStrictEqual(range(1, 10, 2), [1, 3, 5, 7, 9]); assert.deepStrictEqual(range(5, 5), [5]); assert.deepStrictEqual(range(5, 5, 1), [5]); assert.deepStrictEqual(range(0, 0), [0]); assert.deepStrictEqual(range(0), [0]); assert.deepStrictEqual(range(0, 0, 5), [0]); assert.deepStrictEqual(range(1, 10), [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); assert.deepStrictEqual(range(10, 1), [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]); assert.deepStrictEqual(range(10, 1, -2), [10, 8, 6, 4, 2]); assert.deepStrictEqual(range(10, 1, -3), [10, 7, 4, 1]); assert.deepStrictEqual(range(5), [1, 2, 3, 4, 5]); assert.deepStrictEqual( range(100), Array.from({ length: 100 }, (_, i) => i + 1) ); assert.deepStrictEqual(range(-5), [-5, -4, -3, -2, -1]); assert.deepStrictEqual(range(5, 5, 0), [5]); assert.deepStrictEqual(range(5, 5, -1), [5]); assert.deepStrictEqual(range(5, 1, 1), []); assert.deepStrictEqual(range(1, 5, -1), []); assert.deepStrictEqual(range(1, 5, 6), [1]); assert.deepStrictEqual(range(2, 1, -5), [2]); assert.deepStrictEqual(range(0, -1, -5), [0]); assert.deepStrictEqual(range(0, -1, 0), [0]); assert.deepStrictEqual(range(1, 5, 0), [1]); assert.deepStrictEqual(range(0, 5), [0, 1, 2, 3, 4, 5]); assert.deepStrictEqual(range(0, -1), [0, -1]); assert.deepStrictEqual(range(0, -3), [0, -1, -2, -3]); assert.deepStrictEqual(range(-3, 0), [-3, -2, -1, 0]); assert.deepStrictEqual(range(5, 1), [5, 4, 3, 2, 1]);
내가 처음 작성한 코드이다.
args.length
의 경우의 수를 다 작성해보았다..
refectoring 전이라 코드가 많이 지저분 하지만 assert.deepStrictEqual
시 다 통과 되긴했다! 저 코드 작성하는데 1시간 30분 걸렸다..😅
args.length === 1 일때,
args.length === 2 일때,
args.length === 3 일때,
import assert from "assert";
const range = (...args) => {
let result = [];
if (args.length === 1) {
if (args[0] === 0) result.push(0);
if (args[0] > 0)
Array(args[0])
.fill(args[0])
.map((i, index) => (result[index] = index + 1));
else {
Array(Math.abs(args[0]))
.fill(args[0])
.map((i, index) => (result[index] = args[0] + index));
}
} else if (args.length === 2) {
if (args[0] > args[1] && args[1] < 0) {
for (let i = args[0]; i <= Math.abs(args[1]); i += 1) {
result.push(i === 0 ? 0 : -i);
}
} else if (args[0] > args[1]) {
for (let i = args[0]; i >= args[1]; i -= 1) {
result.push(i);
}
} else
for (let i = args[0]; i <= args[1]; i += 1) {
result.push(i);
}
} else if (args.length === 3) {
if (args[0] < args[1] && args[2] < 0) {
return result;
} else if (args[0] < args[1] && args[2] === 0) {
result.push(args[0]);
}
if (args[0] === 0 && args[1] === 0) {
result.push(args[0]);
} else if (args[0] === args[1] && args[2] <= 0) {
result.push(args[0]);
} else if (args[0] === args[1] && args[2] >= 0) {
result.push(args[0]);
}
if (args[0] > args[1] && args[2] < 0) {
for (let i = args[0]; i >= args[1]; i -= Math.abs(args[2])) {
result.push(i);
}
} else if (args[2] < 0 && args[0] !== args[1]) {
for (let i = args[0]; i <= args[1]; i += Math.abs(args[2])) {
result.push(-i);
}
for (let i = args[0]; i <= args[1]; i += args[2]) {
result.push(i);
}
} else if (args[0] < args[1] && args[2] > 0) {
for (let i = args[0]; i <= args[1]; i += args[2]) {
result.push(i);
}
} else if (args[0] > args[1] && args[2] === 0) {
result.push(0);
}
}
return result;
};
몇일동안 고민해보다가 SOLUTION2를 작성했다.
SOLUTION1 방법대로 계속 args의 length에만 집중하다 보니 더 이상방법이 떠오르지 않았는데 매개변수로 start, end, setp을 주어 접근해보니 생각보다 쉽게 작성했다!!
assert.deepStrictEqual를 한줄씩 실행시켜서 통과되면 다음코드 확인하는 식으로 진행했더니 코드 작성하기 시작하고 30분도 안걸려서 작성한것같다😀
const range = (start, end, step = start - end <= 0 ? 1 : -1) => {
const result = [];
// if ((start - end > 0 && step > 0) || (start - end < 0 && step < 0))
if ((start - end) * step > 0) return result;
if (step === 0 || start === end || (start === 0 && end === undefined))
return [start];
for (let i = start; start <= end ? i <= end : i >= end; i += step)
result.push(i);
if (end === undefined)
for (let i = start > 0 ? 1 : start; start > 0 ? i <= start : i < 0; i += 1)
result.push(i);
return result;
};