> For the complete documentation index, see [llms.txt](https://devlee.gitbook.io/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://devlee.gitbook.io/docs/study/99/99-2-til-x-n.md).

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

99클럽 코테 스터디 2일차 TIL 입니다.

## \[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
