[ 문제 ]
처음 문제를 봤을 때는 '아, 반복문 돌려서 가장 짧은 문자열 하나 찾고, 또 반복문 돌려서 가장 긴 문자열 찾아서 splice함수로 제거하면 되겠네!' 이렇게 간단하게 생각했다.
하지만 반복문을 두번 돌리는 대신 한번 돌림으로써 시간복잡도를 줄이고 싶었고, 그럴려다 보니 조금 머리가 아팠다.
그리고 특이점은, 가장 짧은 문자열 또는 가장 긴 문자열이 하나만 존재하는 것이 아니라 여러개가 존재할 수 있다는 것.
[ 풀이 ]
나의 로직은 다음과 같다.
1/ 먼저 가장 문자열 길이가 긴 값, 짧은 값의 index값을 할당할 변수를 각각 shortestIndex, longestIndex로 선언한다.
2/ 인덱스 0, 1 값의 길이를 비교하여 짧은 값의 index를 shortestIndex에, 길거나 같은 값의 index를 longestIndex에 할당한다.
3/ index가 2인 값부터 반복문을 시작하여 길이가 가장 짧은 값, 긴 값을 찾는다.
4/ splice함수를 이용하여 그 값들을 제거한다.
function removeExtremes(arr) {
let shortestIndex; //가장 짧은 길이의 값 index
let longestIndex; //가장 긴 길이의 값 index
if(arr[0].length < arr[1].length){ //index가 0, 1인 값을 비교하여 각 변수에 할당한다.
shortestIndex = 0;
longestIndex = 1;
} else {
shortestIndex = 1;
longestIndex = 0;
}
for(let i = 2; i < arr.length; i++){ //index 2부터 시작하는 반복문을 이용하여
if(arr[i].length <= arr[shortestIndex].length){ //shortestIndex의 값과 비교하여 길이가 짧거나 같으면
shortestIndex = i; //shortestIndex변수에 i 인덱스 재할당
}
if(arr[i].length > arr[longestIndex].length){ //longestIndex의 값과 비교하여 길이가 길면
longestIndex = i; //longestIndex 변수에 i 인덱스 재할당
}
} //여기까지 가장 짧은 길이와 가장 긴 길이의 값에 대한 index가 정해진다.
if(shortestIndex < longestIndex){ //만약 shortestIndex가 longestIndex보다 앞에 있을 경우,
arr.splice(shortestIndex,1); //여기서 배열의 길이가 하나 줄어든다.
arr.splice(longestIndex-1,1); //그럼 longestIndex값도 하나 줄어듦으로 -1을 해줘야한다.
} else { //shortestIndex가 longestIndex보다 뒤에 있을 경우는
arr.splice(shortestIndex,1); //여기서 배열의 길이가 하나 줄어들어도 longestIndex에 지장이 가지 않는다.
arr.splice(longestIndex,1); // 따라서 longestIndex 그대로 사용한다.
}
return arr;
}
문제를 푸는데 조금 까다로웠다.
디버거를 이용하여 하나하나 고치다 보니 완성되었다.
예전에 풀었던 풀이를 보니, reduce함수를 이용하였다..!
function removeExtremes(arr) {
let shortestLetter = arr.reduce(function(acc,cur){
if(cur.length <= acc.length){
return cur;
} else {
return acc;
}
})
let indexOfShortestLetter = arr.indexOf(shortestLetter)
arr.splice(indexOfShortestLetter,1);
let longestLetter = arr.reduce(function(acc,cur){
if(cur.length >= acc.length){
return cur;
} else {return acc;}
})
let indexOfLongestLetter = arr.indexOf(longestLetter)
arr.splice(indexOfLongestLetter,1);
return arr;
}
이 풀이도 나쁘지는 않지만, 어쨌든 reduce함수를 이용하여 arr 배열을 처음부터 끝까지 두번을 왔다갔다해야하니 시간복잡도 면에서 좋을것 같지는 않다.
[ 레퍼런스 ]
레퍼런스를 보면, 먼저 가장 짧은 문자열의 길이(shortestLen), 가장 긴 문자열의 길이(longestLen), 가장짧은 문자열의 인덱스(shortestIdx), 가장 긴 문자열의 인덱스(longestIdx)를 선언하고 내가 생각한 로직과 동일한 반복문을 사용하였다.
그리고, 새로운 빈 배열 result를 선언하여 반복문으로 push함수로 해당 인덱스가 shortestIdx와 longestIdx가 아니면 배열에 추가를 하여 반환을 하는 방식이었다.
오..!괜찮네!!
'자료구조알고리즘 > 코드스테이츠 Coplit' 카테고리의 다른 글
15_modulo (0) | 2022.02.24 |
---|---|
14_superIncreasing (0) | 2022.02.22 |
10_insertDash (0) | 2022.02.18 |
09_ABCheck (0) | 2022.02.16 |
08_convertDoubleSpaceToSingle (0) | 2022.02.15 |