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

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

[level 1] x만큼 간격이 있는 n개의 숫자 - 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]

풀이 코드

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번째 값은 아래와 같은 수가 나오게 된다.

[..., 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 번의 형 변환 비용이 발생하게 된다. 이를 한번으로 줄이는게 좋을 것으로 보이며 아래와 같이 작성할 수 있다.

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 를 통해 가독성도 높이고 코드 또한 간결하게 작성할 수 있다.

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

Last updated