[Javascript] Creating range function

은비·2023년 10월 17일
1

JS_Study

목록 보기
14/18
post-thumbnail

다음과 같은 정수 배열을 생성하는 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]);

📍 SOLUTION 1

내가 처음 작성한 코드이다.

args.length 의 경우의 수를 다 작성해보았다..
refectoring 전이라 코드가 많이 지저분 하지만 assert.deepStrictEqual 시 다 통과 되긴했다! 저 코드 작성하는데 1시간 30분 걸렸다..😅

args.length === 1 일때,

  • args[0]가 양수거나 0이거나 음수일때

args.length === 2 일때,

  • args[0]가 양수거나 0이거나 음수일때
  • args[1]가 양수거나 0이거나 음수일때

args.length === 3 일때,

  • args[0]가 양수거나 0이거나 음수일때
  • args[1]가 양수거나 0이거나 음수일때
  • args[2]가 양수거나 0이거나 음수일때
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;
};

📍 SOLUTION 2

몇일동안 고민해보다가 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;
};

0개의 댓글

관련 채용 정보