Using Language : Java
Using Tools : IntelliJ
- 프로그래머스 문제 소개
<나누어 떨어지는 숫자 배열>
array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.arr divisor return [5, 9, 7, 10] 5 [5, 10] [2, 36, 1, 3] 1 [1, 2, 3, 36] [3,2,6] 10 [-1]
- 문제 풀이 과정
1. arr[]이 divisor에 나누어지는 경우를 찾는다.
2. 나누어 떨어지는 경우마다 카운팅을 하여 정답 배열의 길이를 세준다(=j).
3. 정답 배열answer[]을 선언해준다.
4. arr[]이 divisor에 나누어 지는 경우에만 for문을 사용하여 answer[]에 값을 넣어준다.
5. answer[]을 정렬해준다
6.값을 반환한다.
< Solution3.java >
import java.util.Arrays;
public class Solution3 {
public int[] solution(int[] arr, int divisor){
int j=0;
for(int i=0;i<arr.length;i++){
if (arr[i]%divisor==0){
j=j+1;
}
}
int[] answer = new int[j];
for(int i=0;i<arr.length;i++){
if (arr[i]%divisor==0){
answer[j]=arr[i];
j++;
}
}
Arrays.sort(answer);
return answer;
}
}
< Solution3Test.java >
import org.junit.Test;
import static org.junit.Assert.assertArrayEquals;
public class Solution3Test {
@Test
public void 결과() {
Solution3 solution = new Solution3();
int[] arr = {5,9,7,10};
int divisor = 5;
int[] answer = {5,10};
assertArrayEquals(answer,solution.solution(arr,divisor));
}
}
처음 생각했던 문제 풀이 순서를 이용하여 하드코딩을 진행하였는데,
다음과 같은 에러 사항이 나타났다.
- 시행착오 1
java.lang.ArrayIndexOutOfBoundException
코드를 실행하였을 때 위와 같은 오류가 나타나게되었다.
오류 메세지에서도 대충 무엇이 잘못되었는지 알 수있었지만,
더 상세한 오류 내용을 알기위해서 검색한 결과 배열의 Index에러라는 것을 알게 되었다.
코드를 다시 살펴보니 두번째 for문에서 j값을 초기화 해주지 않아
배열의 index 값이 지정해준 길이보다 커지는 것을 확인할 수 있다.
예 ) < Solution3.java >
import java.util.Arrays;
public class Solution3 {
public int[] solution(int[] arr, int divisor){
int j=0;
for(int i=0;i<arr.length;i++){
if (arr[i]%divisor==0){
j=j+1;
}
}
int[] answer = new int[j];
// j 값이 0 이 아닌 숫자로 배열이 선언됨
// 하지만 0으로 초기화가 되지않아서 아래 for문에서 오류 발생
for(int i=0;i<arr.length;i++){
if (arr[i]%divisor==0){
answer[j]=arr[i];
j++;
}
}
Arrays.sort(answer);
return answer;
}
}
이러한 문제점을 해결하기 위해서 for문을 시작하기 전, j=0으로 초기화 시켜주었다.
이렇게 하고 테스트 결과들을 모두 실행해보니 정상적으로 돌아갔고, 문제가 끝난줄 알아서 프로그래머스에 돌려보았는데,
나누어 떨어지는 경우가 없을때 -1을 반환하는 경우를 처리하지 못해서 오류가 났다.
-1을 반환하는 예외처리를 추가하니 소스코드가 다음과 같이 완성되었다.
예 ) < Solution3.java >
import java.util.Arrays;
public class Solution3 {
public int[] solution(int[] arr, int divisor){
int j=0;
for(int i=0;i<arr.length;i++){
if (arr[i]%divisor==0){
j=j+1;
}
}
int[] answer = new int[j];
// 나누어 떨어지는 경우가 없을때 -1 반환 예외처리
// JUnit을 사용해서 테스트시에는 오류가 발생하지 않지만
// 프로그래머스에선 오류가 발생하여 추가
if(j==0){
answer = new int[]{-1};
}
// j값 초기화
j=0;
for(int i=0;i<arr.length;i++){
if (arr[i]%divisor==0){
answer[j]=arr[i];
j++;
}
}
Arrays.sort(answer);
return answer;
}
}
프로그램 실행 결과 성공적이였다.