CODING/CS, 알고리즘, 자료구조 공부

[프로그래머스] x만큼 간격이 있는 n개의 숫자

codingTrip 2025. 6. 4. 12:12

나의 풀이

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

 

트러블슈팅 1

long[] answer = {};

빈 배열에 값을 넣으려고 해서 아래와 같이 예외가 발생했다.

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
at Ex16_2$Solution.solution(Ex16_2.java:6)
at Ex16_2.main(Ex16_2.java:16)
long[] answer = new long[n];

배열의 개수를 n으로 설정해서 초기화했습니다.

 

트러블슈팅 2

for (int i = 0;i < n;i++) {
    answer[i] = x;
    x += x;
}

위와 같이 설정했더니 기댓값 2,4,6,8,10이 아닌

2,4,8,16,32가 나왔다.

int y = x;
for (int i = 0;i < n;i++) {
    answer[i] = y;
    y += x;
}

그래서 y라는 변수를 추가했다.

 

트러블슈팅 3

제출 후 채점하기에서 일부 문제가 실패하게 되었다.

원인은 새로 추가한 변수의 타입이 문제였다.

배열은 long 타입이기 때문에 int 범위를 초과하는 값을 넣을 경우 문제가 발생할 수 있다.

따라서 아래와 같이 수정했다.

long y = x;

 

트러블슈팅을 작성해보니, 내가 생각보다 놓치고 있는 지점들이 있다는 것을 깨달았다.

다음에는 좀 더 꼼꼼하게 고려하면서 문제를 풀어야겠다.


 

다른 사람의 풀이 1

import java.util.*;
class Solution {
    public static long[] solution(int x, int n) {
        long[] answer = new long[n];
        answer[0] = x;

        for (int i = 1; i < n; i++) {
            answer[i] = answer[i - 1] + x;
        }

        return answer;

    }
}

i를 1부터 시작해서 이전 값에 x를 더한다는 점이 더 바람직하다고 생각한다.

문제를 그대로 잘 해석했다고 생각한다.

 

다른 사람의 풀이 2

import java.util.stream.LongStream;
class Solution {
  public long[] solution(int x, int n) {
      return LongStream.iterate(x, i->i+x).limit(n).toArray();
  }
}

LongStream.iterate(x, i -> i + x)

  • x부터 시작해서 i + x씩 증가하는 무한 스트림을 만듭니다.
  • 예: x = 3이면 → 3, 6, 9, 12, ...

.limit(n)

  • 스트림에서 앞의 n개까지만 가져옴
  • 예: x = 3, n = 5 → 3, 6, 9, 12, 15

.toArray()

  • 스트림을 long[] 배열로 변환해서 반환함

출처 : https://school.programmers.co.kr/learn/courses/30/lessons/12954/solution_groups?language=java