문제
문자열을 요소로 갖는 배열을 입력받아 가장 짧은 문자열과 가장 긴 문자열을 제거한 배열을 리턴해야 합니다.
주의 사항
가장 짧은 문자열의 길이와 가장 긴 문자열의 길이가 같은 경우는 없습니다.
가장 짧은 문자열 또는 가장 긴 문자열이 다수일 경우, 나중에 위치한 문자열을 제거합니다.
공백을 입력받을 경우, null을 반환합니다.
public class Solution {
public String[] removeExtremes(String[] arr) {
// TODO:배열 내에 있는 가장 짧고 긴 배열의 요소를 삭제, 같은 숫자가 있을 경우 나중에 있는 것을 뺀다.
//공백을 입력받는 경우
if(arr.length == 0) return null;
//최대 길이는 20, 최소 길이는 0으로 기본값을 설정
//최단,최장 길이 변수와 최단, 최장의 인덱스를 담을 변수
//{"a", "b", "c", "def"});
int shortStr = 20;
int longStr = 0;
int shortestIdx = 0;
int longestIdx = 0;
for(int i = 0; i<arr.length; i++){
//해당 요소가 longStr보다 크면
if(arr[i].length() >= longStr){ // 1 >= 0
//longStr에 현재 문자열의 길이를 넣어주고, longestIdx에 현재 인덱스를 넣어준다.
longStr = arr[i].length();
longestIdx = i;
}
//같은 방식으로 최소 문자열과 인덱스를 찾아 대입한다.
if(arr[i].length() <= shortStr){
shortStr = arr[i].length();
shortestIdx = i;
}
}
//결과를 넣어줄 새로운 배열을 선언. 최소 문자여과 최대 문자열을 제외하기 때문에 -2만큼 배열을 선언한다.
String[] result = new String[arr.length-2];
int curIndex = 0;
//배열을 순회하며 결과를 넣어준 후
for(int i=0; i<arr.length; i++){
if(i != shortestIdx && i != longestIdx){
result[curIndex] = arr[i];
curIndex++;
}
}
return result;
}
}
알고리즘 쉽지 않다.. 갈수록 자존감은 낮아져간다.. 포기하지말자.. 계속 풀자..
의사코드를 계속 작성하면서 풀어나가보자. 아래는 내가 쓴 의사코드이다.
비교해보자.
짧은 문자를 지우기 위해 비교를 한다
같은 길이의 문자가 있는지 여부를 파악한다.
있으면 가장 나중에 있는 짧은 길이의 문자를 삭제한다.
없으면 해당 문자를 지운다.
큰 문자를 지운다.
같은 길이의 문자가 있는지 여부를 파악한다.
있으면 가장 나중에 있는 큰 길이의 문자를 삭제
없으면 해당 문자를 지운다