코딩테스트/JAVA
[코딩테스트] x만큼 간격이 있는 n개의 숫자
개발하는체대생
2022. 9. 29. 23:52
[문제]
함수 solution은 정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴해야 합니다. 다음 제한 조건을 보고, 조건을 만족하는 함수, solution을 완성해주세요.
[제한 조건]
- x는 -10000000 이상, 10000000 이하인 정수입니다.
- n은 1000 이하인 자연수입니다.
[풀이]
//1. for문을 n번 돌려준다.
//2. 이때 한번씩 돌때마다 x만큼 증가하도록 조건을 준다.
//3. for문이 x만큼씩 증가할 때 마다 answer 배열에 담아준다.
나의 답안 (방법1)
class Solution {
public long[] solution(int x, int n) {
//1. for문을 n번 돌려준다.
//2. 이때 한번씩 돌때마다 x만큼 증가하도록 조건을 준다.
//3. for문이 x만큼씩 증가할 때 마다 answer 배열에 담아준다.
long[] answer = new long[n];
for(int i=0; i < n; i++){
answer[i] = x+(long)x*i;
}
return answer;
}
}
나의 답안 (방법2)
class Solution {
public long[] solution(int x, int n) {
//방법2
// answer[i-1] = (long)(x*i); => 실패
// answer[i-1] = (long)x*i; => 괄호를 제거해주니 성공
long[] answer = new long[n];
for(int i=1; i <= n; i++){
answer[i-1] = (long)x*i;
}
return answer;
}
}
시행착오 (방법1)
class Solution {
public long[] solution(int x, int n) {
//1. for문을 n번 돌려준다.
//2. 이때 한번씩 돌때마다 x만큼 증가하도록 조건을 준다.
//3. for문이 x만큼씩 증가할 때 마다 answer 배열에 담아준다.
// 방법1
// -> 결과값은 올바르다. 그러나 오답처리
// -> 실행속도 때문에 문제가 생긴건 아닐까??
// -> 타입이 문제??
// int 타입 "-10000000 이상, 10000000 이하인 정수" 는 해당됨
// 원인 => x*i 연산 전에 x 타입을 int 에서 long으로 바꿔줘야함.
// 이유 ?
long[] answer = new long[n];
for(int i=0; i < n; i++){
answer[i] = x+(long)x*i;
//answer[i] = x+(long)(x*i); => 실패 ?
//answer[i] = (long)(x+(x*i)); => 실패 ?
//answer[i] = (long)x+(long)x*i; => 성공
//answer[i] = (long)(x+(x*i)); => 실패 ?
//answer[i] = x+(long)x*i; => 성공
}
return answer;
}
}
이유 : x*i 의 연산이 일어나기 전에 long 타입으로 바꿔줘야지 타입 오류가 나지 않는다. 왜냐하면 1,000,000,000 이 넘는 자리 수가 담길 수 있기 때문에 int 타입으로 연산을 진행하면 오류가 난다.
회고
- 타입 확인의 중요성을 다시 한번 느꼈다.
- 문제를 다 풀었음에도 실패의 근본적인 이유을 찾아가는 과정이 흥미로웠다.
- 자바에 대한 이론적인 공부의 필요성을 느꼈다