# \[99클럽 코테 스터디 2일차 TIL] 프로그래머스 - x만큼 간격이 있는 n개의 숫자

## \[level 1] x만큼 간격이 있는 n개의 숫자 - 12954

[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/12954)

#### 성능 요약

메모리: 79.3 MB, 시간: 0.06 ms

#### 문제 설명

함수 solution은 정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴해야 합니다. 다음 제한 조건을 보고, 조건을 만족하는 함수, solution을 완성해주세요.

**제한 조건**

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

**입출력 예**

| x  | n | answer        |
| -- | - | ------------- |
| 2  | 5 | \[2,4,6,8,10] |
| 4  | 3 | \[4,8,12]     |
| -4 | 2 | \[-4, -8]     |

## 풀이 코드

```java
class Solution {
    public long[] solution(int x, int n) {
        long[] answer = new long[n];
        for (int i = 0; i < n; i++) {
            answer[i] = (long) x * (i + 1);
        }
        return answer;
    }
}
```

x 숫자에 대한 구구단 값을 배열에 넣으면 되는 문제다. 구구단은 1부터 시작하니까 `i + 1` 로 곱한다.

## 돌아보기

처음 풀이 코드를 제출하고 실패 했는데 `long` 으로 캐스팅하지 않았기 때문이다. 왜냐하면 연산 결과가 정수형의 최대 크기를 넘어갔기 때문이다. 예를 들어 x 의 양수 최대 크기인 1000만과 n 의 최대 크기 1000 을 곱하면 100억이 되고 이는 정수형의 최대 크기 약 21억을 넘어가게 되기 때문에 실패하게 된다.

캐스팅을 하지 않고 x 에 1000만과 n 에 215 를 넣어서 로직을 돌려보면 215번째 값은 아래와 같은 수가 나오게 된다.

```bash
[..., 2140000000, -2144967296]
```

정수형 범위는 -2^31 - 1 \~ 2^31 -1 로 -2,147,483,648 \~ 2,147,483,647 이다. 그렇기 때문에 214번째에서 1000만을 더하는 순간 정수형의 최대 크기를 넘어서게 되고 최솟 값으로 돌아가 남는 수만큼 최솟 값에 더하게 된다.

따라서 x 값을 `long` 으로 캐스팅하고 `i + 1` 과 곱하게 되면 정수형보다 범위가 큰 `long` 타입으로 연산이 되기 때문에 문제없이 통과하게 된다.

### 개선하기

위 풀이 코드는 n 번동안 x 값을 `long` 타입으로 캐스팅하게 되면서 n 번의 형 변환 비용이 발생하게 된다. 이를 한번으로 줄이는게 좋을 것으로 보이며 아래와 같이 작성할 수 있다.

```java
class Solution {
    public long[] solution(int x, int n) {
        long[] answer = new long[n];
        long longX = x;
        for (int i = 0; i < n; i++) {
            answer[i] = longX * (i + 1);
        }
        return answer;
    }
}
```

또한 StreamAPI 를 통해 가독성도 높이고 코드 또한 간결하게 작성할 수 있다.

```java
class Solution {
    public long[] solution(int x, int n) {
        long longX = x;
        return LongStream.range(1, n + 1)
                .map(i -> longX * i)
                .toArray();
    }
}
```

대신 StreamAPI 는 성능 면에서 떨어질 수 있기 때문에 잘 알아보고 활용해야겠다.

### 다음에는

1. 자료형의 범위에 대해 신경쓰기
2. 형 변환 비용 생각하기

***

\#99클럽 #코딩테스트준비 #개발자취업 #항해99 #TIL


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://devlee.gitbook.io/docs/study/99/99-2-til-x-n.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
