알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄
https://programmers.co.kr/learn/courses/30/lessons/12954
코딩테스트 연습 - x만큼 간격이 있는 n개의 숫자
함수 solution은 정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴해야 합니다. 다음 제한 조건을 보고, 조건을 만족하는 함수, solution을 완성해주세요.
programmers.co.kr

Think🤔
파라미터로 int x,n값을 받고
x를 누적해서 n만큼 더해주는 값을 차례대로 answer 배열에 long타입 형태로 넣어주면 되는 문제
class Solution {
public long[] solution(int x, int n) {
long[] answer = new long[n];
int tmp = x;
for(int i=0; i<n; i++){
answer[i] = x;
x = x + tmp;
}
return answer;
}
}
이렇게 하니 두 개의 테스트 케이스를 통과하지 못한다.
x의 범위도 int값 안에 있어서 딱히 for문 안에 있는 int가 문제는 아닌 것 같다.
class Solution {
public long[] solution(int x, int n) {
long[] answer = new long[n];
int tmp = x;
for(int i=0; i<n; i++){
answer[i] = x;
x = tmp * (i+2);
}
return answer;
}
}
마찬가지로 이 방법도 실패했다..
n은 1000 이하인 자연수라고 했는데
0이 들어올때를 생각해보자
n이 0이면 0을 보내줘야 한다.. 혹시 이 부분 떄문에 안되는 걸까?
파라미터로 long 타입으로 받은 값이 알고보니 범위를 넘어가는 것 같다.
만약 x가 최댓값인 10,000,000 이고, n이 1000이하인 자연수이니 1000이라고 가정하면
1,000 * 10,000,000 = 10,000,000,000 이므로 마지막 부분에서 int 범위를 넘어가게 된다.
고로 다른 방법을 이용해서 풀어야 되거나 아니면 파라미터 값을 int형인 long타입으로 바꾸면 된다.
Solution✍
class Solution {
public long[] solution(int x, int n) {
long[] answer = new long[n];
long sum = 0;
for(int i=0; i<n; i++){
sum = (long)x * (i+1);
answer[i] = sum;
}
return answer;
}
}
x 를 명시적 형변환 (long)으로 바꿧더니 해결 되었다.
class Solution {
public long[] solution(int x, int n) {
long[] answer = new long[n];
answer[0] = x;
for(int i=1; i<n; i++){
answer[i] = answer[i-1] +x;
}
return answer;
}
}
처음 배열 값에 x를 넣고 전의 배열 값에 x를 추가시켜줌으로 해결
Review🤩
타입의 중요성을 다시 한번 느꼇고, 이런 디테일한 부분에서 예외가 발생한 줄은 몰랐다.
'Algorithm' 카테고리의 다른 글
[프로그래머스] 하샤드 수 (0) | 2021.12.02 |
---|---|
[프로그래머스] 핸드폰 번호 가리기 (0) | 2021.12.02 |
[프로그래머스] 자연수 뒤집어 배열로 만들기 (0) | 2021.12.01 |
[프로그래머스] 제일 작은 수 제거하기 (0) | 2021.12.01 |
[프로그래머스] 직사각형 별찍기 (0) | 2021.12.01 |