본문 바로가기

자료구조알고리즘/코드스테이츠 Coplit

11_removeExtremes

[ 문제 ]

처음 문제를 봤을 때는 '아, 반복문 돌려서 가장 짧은 문자열 하나 찾고, 또 반복문 돌려서 가장 긴 문자열 찾아서 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