문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/12954
public long[] solution(int x, int n)
{
long[] answer = new long[] {};
for (int i = 1; i <= n; i++)
{
answer[i - 1] = x * i;
}
return answer;
}
문제 자체는 어렵지 않았다. 다만, 배열의 크기를 어떻게 동적 할당을 할 수 있을지 고민을 했다.
long[] answer = new long[] {};
을 보고 맨 처음에는 new로 할당이 되어 있으니 크기를 지정 안해도 되는건가? 싶어서 위와 같이 풀었는데 Null 참조 에러가 발생했다. 중단점을 활용하여 확인해보니 answer가 null이었기 때문에 발생한 문제였다.
new로 할당만 하면 null로 할당이 된다! 기억해두자.
public long[] solution(int x, int n)
{
long[] answer = new long[n];
for (int i = 1; i <= n; i++)
{
answer[i - 1] = x * i;
}
return answer;
}
확인을 해보니 배열 선언 시 중괄호를 제거하면 배열의 크기에 변수를 넣을 수 있었다.
테스트도 해보니 문제가 없이 돌아가서 제출을 했더니 왠걸, 2개의 케이스에서 문제가 발생했다.
왜 그럴까 생각을 해봐도 코드에는 문제가 없는 것 같아서 고민을 해보았다. 결국 내가 생각한 결론은 문제는 long 형을 사용을 하니, 오버플로우가 발생하는 것이 아닐까? 하는 생각이 들었다.
public long[] solution(int x, int n)
{
long[] answer = new long[n];
for (long i = 1; i <= n; i++)
{
answer[i - 1] = x * i;
}
return answer;
}
x * i
가 int형인데 answer가 long형이기 때문에 이 곳에서 오버 플로우가 발생한다고 판단해서 형변환을 위해 i를 long형으로 선언해서 제출하니 해결할 수 있었다.
맨 처음에는 x * i
로 해도 long형으로 암시적 형변환이 되니 문제가 없을 것이라고 생각했지만, x * i
에서 int의 범위를 벗어나면 오버플로우가 발생한다는 것을 생각하지 못해서 발생한 문제였다.