진짜.. 요 며칠간 힘들게 푼 문제 ㅠㅠ
테스트 케이스가 4, 3, 2, 1 이랑 10 두개만 있었을 때는 아무리 돌려도 통과가 되는데
제출만 하면 아래와 같이 알 수 없는 런타임 에러와
테스트 실패가 연이어 나왔다 ㅠㅠ
최초 작성했던 소스는 이렇다.
런타임이 발생했던 원인은
전에 작성했던
for (int i = 0; i < s.length; i++) {
if (s[i] != compNum) {
answer[i] = s[i];
}
}
이 코드가 문제였는데, answer[i] 는 위에서 s.length에 -1을 한 값으로 배열을 만들어놨는데,
작은 크기에 s[i]를 넣어주려고 하니, ArrayIndexOutOfBoundsException이 발생하거나, 혹여나 코드가 실행되도, 전부 실패처리가 되어버리는 것이다.
그래서 소스를 전체적으로 뜯어고치기로 했다.
Arrays보다 좀 더 효율적인 최소값 구하는 반복문을 작성하여 추가하였고, 제일 큰 문제가 됐던
answer 배열의 idx 값을 수정해주었다.
주변에 도움을 주시는 감사한 분들과 검색을 하면서 문제풀이한 결과 거의.. 하루만에 문제를 풀 수 있었다.
아래가 해답
package list;
import java.util.Arrays;
public class Programmers_MinimumNumber {
public static int[] solution(int[] arr) {
// 배열의 크기가 0, 1 이면 -1 리턴
if (arr.length <= 1) {
return new int[]{-1};
}
// 비교할 숫자(최소값) 선언
int compNum = arr[0];
// 최소값을 구하는 반복문
for (int i = 0; i < arr.length; i++) {
if (arr[i] < compNum) {
compNum = arr[i];
}
}
// 리턴할 answer 배열 선언
int[] answer = new int[arr.length - 1];
// answer의 idx 값을 따로 만들어줬다.
int idx = 0;
// answer에 arr 값을 넣어주고
for (int i = 0; i < arr.length; i++) {
if (arr[i] != compNum) {
answer[idx] = arr[i];
// 만약 조건을 만족하여 들어갔다면 인덱스를 ++
idx++;
}
}
// 결과 출력
return answer;
}
public static void main(String[] args) {
// 파라미터
int[] result = solution(new int[]{4, 1, 2, 3});
// 솔루션 값 출력
System.out.print(Arrays.toString(result));
}
}
이 문제는 여러개의 배열을 어떻게 컨트롤 할 것인지, 최소값은 어떻게 구해서 넣어줄건지 고려해야하는 부분이 많지만 그만큼 생각을 여러번, 오랫동안 할 수 있는 문제여서 좋았다. 나만 어렵게 생각한건가..?
주석을 달아놓는다고 최대한 달아놨는데.. 혹시나 이해가 안된다면 대.. 댓글을
끗!
반응형
'Algorithm > Programmers' 카테고리의 다른 글
[Programmers] Java 프로그래머스 레벨1 정수 내림차순으로 배치하기 해답 (Arrays, Collection) (0) | 2021.09.06 |
---|---|
[Programmers] Java 프로그래머스 레벨1 가운데 글자 가져오기 해답 (0) | 2021.09.05 |
[Programmers] Java 프로그래머스 레벨1 배열의 평균구하기 (자바 평균 구하기) 해답 (0) | 2021.08.31 |
[Programmers] Java 프로그래머스 레벨1 자바 직사각형 별찍기 해답(자바 별찍기) (0) | 2021.08.30 |
[Programmers] Java 프로그래머스 레벨1 자바 문자열 내림차순으로 배치하기 해답 (0) | 2021.08.29 |