본문 바로가기
Algorithm/프로그래머스(Programmers)

[ 자바스크립트(JS), 파이썬(python) ] 프로그래머스 level1 - x만큼 간격이 있는 n개의 숫자

by YWTechIT 2021. 4. 5.
728x90

📌 x만큼 간격이 있는 n개의 숫자

정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴하는 함수를 만드시오.

제한 조건

  1. x는 -10000000 이상, 10000000 이하인 정수입니다.
  2. n은 1000 이하인 자연수입니다.

1️⃣ 파이썬(Python) 풀이

x가 -10000000 이상, 10000000이하인 정수이므로, 계산 방법을 양수일 때, 음수일 때로 나눴다.

또, 이 문제는 while, range로 풀 수 있는데, 코드를 짧게 만들고 싶어 한 줄로 요약하려다가 실패하고 while문으로 풀었다.(그냥 양수, 음수별로 나눠서 range로 작성했으면 더 짧았을 텐데...) 코드 순서대로 풀이방법은 다음과 같다.

 

  1. while: 기존 number = number + x의 값을 누적하는 방식이다. 한 사이클이 돌면 cnt를 증가시키고 cnt가 n보다 크거나 같을 때 종료하는 과정이다.
  2. range: x가 양수 혹은 음수일때로 나눠서 작성했다. range의 세번째 파라미터에서 step(x)만큼 증가하는 코드가 특징이다.
  3. range: 등차수열의 특징을 이용했고, 공차(n)만큼 곱해주었다.

 

# while로 작성한 코드
def solution1(x, n):
    number, result = x, []
    cnt = 0
    while cnt < n:
        result.append(number)
        number += x
        cnt += 1
    return result

# range로 작성한 코드
def solution2(x, n):
    if x > 0:
        return list(range(x, x*n+1, x))
    else:
        return list(range(x, x*n-1, x))

# 다른사람의 코드
def solution3(x, n):
    return [i*x for i in range(1, n+1)]

2️⃣ 자바스크립트(JS) 풀이(21. 8. 2.)

처음 arr을 어떻게 0으로 초기화 시켜야 할지 고민을 많이 했다. python에서는 단순하게 [0] * n을 작성하면 되는데 JS에서는 다른 방법을 찾아야 한다. 가독성을 제쳐두고 다음과 같은 방법을 찾았다.

 

  1. let answer = [...Array(n)].map(() => 0);
  2. let answer = Array(n).fill(0)
  3. let answer = Array.apply(null, Array(n)).map(() => 0);

 

이 중에서 가독성이 가장 좋은 코드는 2번이었다. 다른사람의 코드에서 increase를 사용 할 필요없이 idx로 해결하니까 코드가 훨씬 간결해졌다.

 

  1. n만큼의 길이를 각각 x로 초기화시킨다. (초기값: [2, 2, 2, 2, 2])
  2. map 함수를 사용하여 idx에 1씩 더해준 값에 현재 val를 곱하여 반환한다.

 

// 나의 코드
function solution(x, n) {
    let answer = [...Array(n)].map(() => 0);
    let increase = x;
    answer.map((val, idx) => {answer[idx] = increase, increase += x})
    return answer
}

// 나의 코드2
function solution(x, n) {
    let answer = Array.apply(null, Array(n)).map(() => 0);
    let increase = x;

    answer.forEach(function(val, idx){
        answer[idx] = increase;
        increase += x;
    })

    return answer
}
// 다른 사람의 코드
function solution(x, n) {
    return Array(n).fill(x).map((v, i) => (i + 1) * v)
}
반응형

댓글