코딩테스트

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

nvvs 2022. 7. 8. 15:52

문제

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

예시)

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];
        
        int xx = x;
        for(int i = 0; i < n; i++){
            answer[i] = xx;
            xx += x;
        }
        
        return answer;
    }
}

 

이렇게 풀었더니 테스트 코드로는 통과가 됐지만 제출하니 테스트 13, 14에서 실패를 했다.

이유를 모르겠어서 다른 사람들것 참고하니 타입을 long으로 바꾸면 통과가 되는 것 같았다.

(누적 변수의 타입을 long으로 바꾸든, 누적할 때 형변환을 long으로 하든, 파라미터 x의 타입을 long으로 바꾸든 아무튼 long으로 바꿔야 문제가 해결되는것 같았다.)

 

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

 

나는 누적 변수 타입을 int에서 long으로 변경한 후에 다시 채점을 돌렸더니 통과가 되었다.

int에서 long으로 바꾸면 통과가 된다는건 테스트 코드 13, 14에서 int 타입이 저장할 수 있는 값을 넘는 숫자로 테스트를 했나보다 싶었다.

 

왜냐하면 정수 타입은 저장할 수 있는 값의 범위를 초과할 경우 다시 최소값부터 저장하기 때문이다.

이 생각이 맞나 싶어서 테스트 코드를 추가해서 코드를 실행시켜 보았다.

 

int의 최대 저장값인 2147483647을 x값으로 설정했다.

결과는 아래와 같았다.

for문에서 더하면서 int의 저장 값을 넘어가는 숫자가 들어왔으니 -2로 떨어지면서 예상했던 값과 다르게 되었다.

 

long으로 변경하고 코드를 돌려보았다.

long의 저장 값 범위 안에 있는 숫자이기 때문에 예상한 값이 그대로 들어갔다.

 

힌트를 어디서 얻었어야 했을까?

애초에 return 값의 타입을 int가 아닌 long으로 설정했다는 것에서 얻었어야 했을까?

 

그래도 원인을 알아내서 다행이라고 생각한다.

근데 Level 1도 잘 못하는 이유가 뭐야...?

 

 

[문제 출처: 프로그래머스]