[20231108] Lv 1. x만큼 간격이 있는 n개의 숫자

일단 기록하기·2023년 11월 25일

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

등차수열 배열을 구하는 문제이다. 반환값은 long[]이다.

[나의 풀이]

class Solution {
    public long[] solution(int x, int n) {
        
        long[] answer = new long[n];
        long firstNum = x;
        
        for(int i=0; i<n; i++) {
            answer[i] = firstNum;
            firstNum += x;
        }
        
        return answer; 
    }
}
  • 배열의 길이는 n이 되므로 배열을 n의 길이로 초기화한다.
  • firstNm 변수를 선언하여, 배열의 첫번째 값으로 초기화한다.
  • for문의 i값이 증가하면, firstNm에 x값을 더한 값을 세팅한다.

[틀린 답 분석]

class Solution {
    public long[] solution(int x, int n) {
        
        long[] answer = new long[n];
        
        for(int i=0; i<n; i++) {
            answer[i] = x * (i+1);
        }
        
        return answer; 
    }
}
  • 처음에 제출했던 답안이다. 테스트 13, 14에서 에러가 났는데 오버플로우 관련된 문제였다.
  • for문에서 x * (i+1)은 int와 int를 곱한 값이다. x는 -10000000 <= x <= 10000000 의 범위이고, n은 1000 이하의 자연수이고, x의 최대값과 n의 최대값을 곱한 경우 10,000,000,000 이다. int의 범위는 -2,147,483,648 ~ 2,147,483,647 로 이 범위를 초과하기 때문에 오버플로우가 일어난다. 오버플로우로 데이터의 오류가 발생하여 테스트케이스 에러가 발생했다.
  • 그래서 long firstNum을 선언하여 x를 대입해서 자동형변환이 일어나 저장을 하고 이 값을 answer[0]에 저장했다. for문을 수행하며 int x의 값을 더해줬고 여기서도 자동형변환이 적용되어 long의 값으로 firstNum에 다시 저장된다.

[수정 사항]

  • firstN을 선언해서 초기값을 넣을 필요 없이 바로 answer[0] 에 초기값을 넣어주면 된다. 이 경우에는 for문의 i를 1로 초기화하고, for문의 코드도 수정해야 한다.
  • 수정코드
class Solution {
    public long[] solution(int x, int n) {
        
        long[] answer = new long[n];
        long answer[0] = x;
        
        for(int i=1; i<n; i++) {
            answer[i] = answer[i-1] + x;
        }
        
        return answer; 
    }
}

[참고]

오버플로우
메모리의 표현 범위에서 벗어난 수의 값을 할당하게 되는 경우이다.

형변환
값의 자료형을 바꾸는 것.
자동 형변환 : 컴파일러가 자동으로 값의 범위가 작은 자료형을 값의 범위가 큰 자료형으로 변환
강제 형변환 : 값의 범위가 큰 자료형을 값의 범위가 작은 자료형으로 형변환

profile
모르는 건 일단 기록이라도 해놔야

0개의 댓글