해결된 질문
작성
·
84
·
수정됨
0
문제
정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.
arr은 길이 1 이상인 배열입니다.
인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.
arr [4,3,2,1] [10]
return [4,3,2] [-1]
원시상태로 돌아가서 기본형 배열만 가지고 풀어보고 싶어서 풀어봤는데、 정답 제출했더니 틀렸다고 뜨는데 혹시 문제가 되는 부분 살펴봐주실 수 있나요。。。ㅠㅠ
질문하기도 부끄러울 정도로 난잡하고 부족한 코드지만。。
쉬지않고 3시간을 거북이처럼 목 내밀고 작성했습니다。。。
뭐가 잘못된 건지、 해결 못하면 전 살 수 없을 거 같아요。。。
public int[] solution(int[] arr) {
//배열원소의 중복값 제거
int paramLength = arr.length;
int breakCount;
int targetIndex = 0;
while (targetIndex < paramLength) {
breakCount = 0;
for (int i = targetIndex; i < paramLength - 1; i++) {
if (arr[targetIndex] == arr[i + 1]) {
for (int j = targetIndex; j < paramLength - 1; j++) {
arr[j] = arr[j + 1];
}
arr[paramLength - 1] = 0;
paramLength--;
breakCount++;
break;
}
}
if (breakCount == 0) {
targetIndex++;
}
}
//배열의 비어있는 요소 삭제
int[] useArr = new int[paramLength];
System.arraycopy(arr, 0, useArr, 0, paramLength);
//작은값 필터
int indexCount = 0;
int min = useArr[0];
for (int i = 0; i < useArr.length - 1; i++) {
if (min > useArr[i + 1]) {
useArr[indexCount] = min;
min = useArr[i + 1];
} else if (min < useArr[i + 1]) {
useArr[indexCount] = useArr[i + 1];
}
indexCount++;
}
//리턴할 배열에 결과 담기
int[] answer;
if (indexCount == 0) {
answer = new int[]{-1};
return answer;
}
answer = new int[indexCount];
for (int i = 0; i < indexCount; i++) {
answer[i] = useArr[i];
}
return answer;
답변 1
1
안녕하세요, 인프런 AI 인턴입니다.
권정익님의 질문에 대한 답변입니다. 제시된 문제의 목적은 배열에서 가장 작은 수를 제거하고, 결과 배열을 리턴하는 것입니다. 코드를 살펴본 결과 몇 가지 문제점을 발견하였습니다.
제공된 코드에서 배열의 중복 값 제거 로직은 이 문제에서 요구하지 않습니다. 주어진 제한 조건에 따르면 arr[i] ≠ arr[j] 이므로 배열 내의 모든 값은 고유합니다. 따라서 이 부분의 코드는 필요 없습니다.
가장 작은 수를 제거하는 로직에서, 실제로는 가장 작은 수를 찾고, 그 수를 제외한 새로운 배열을 생성해야 합니다. 현재 로직에서는 이 과정이 정확하게 수행되지 않고 있습니다.
indexCount
변수는 최종 배열의 크기를 결정하는데 사용되지만, 이는 배열에서 최소값을 제거한 후의 크기와 같아야 합니다. 즉, 원본 배열의 크기에서 1을 뺀 값이 되어야 합니다. 현재 로직에서는 이 값을 정확히 계산하지 않습니다.
문제를 해결하기 위한 간단한 해결책을 아래에 제시합니다:
public int[] solution(int[] arr) {
if (arr.length <= 1) {
return new int[]{-1}; // 입력 배열의 길이가 1 이하인 경우, -1을 담은 배열 리턴
}
int min = arr[0];
// 배열에서 가장 작은 수 찾기
for (int i = 1; i < arr.length; i++) {
if (arr[i] < min) {
min = arr[i];
}
}
// 가장 작은 수를 제외한 배열 생성
int[] answer = new int[arr.length - 1];
int index = 0;
for (int value : arr) {
if (value != min) {
answer[index++] = value;
}
}
return answer;
}
이 코드는 주어진 배열에서 가장 작은 수를 찾은 후, 그 수를 제외한 새로운 배열을 생성하여 리턴합니다. 가장 작은 수가 여러 개 존재할 수 있다는 제한 조건이 없으므로, 이 로직이 문제의 요구사항을 만족합니다.
질문에 제시된 코드를 수정하거나 위에 제시된 로직을 참고하셔서 문제를 해결해 보시기 바랍니다.
개비스콘.... 감사합니다....