Algorithm | 문자열 내림차순으로 배치하기

권기현·2021년 3월 19일
0

Algorithm

목록 보기
6/20
post-thumbnail

프로그래머스 Lv1

문제 설명

문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수, solution을 완성해주세요.
s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다.

제한 사항

str은 길이 1 이상인 문자열입니다.

sreturn
"Zbcdefg""gfedcbZ"

📍 나의 풀이

function solution(s) {
    let sArr = s.split('').sort().reverse();
    let upperStrArr = [];
    for(let i=0; i<sArr.length; i++){
        if(sArr[i] === sArr[i].toUpperCase() ){
            let upperStr = sArr[i];
            upperStrArr.push(upperStr);
            sArr.splice(i,1);
            i--
        }
    }
    const resultArr = [...sArr,...upperStrArr.sort().reverse()]
    return resultArr.join('');
}

sort()함수가 대소문자에 대한 구별을 할 수 있다는 것을 몰라서 일어난 대참사이다. sort()메소드 자체에서 대소문자를 구별하여 오름차순이라면 대문자는 소문자 전에 온다.

참고자료 | Sort a string, UpperCase before LowerCase

무튼, 왜인지 모르겠지만

위처럼 대문자일 경우 따로 만든 배열에 push()하고, 기존의 배열에서는 제외시켰다.
또 for문 안에서 i를 1씩 더해가며 반복하는데 기존의 배열에서 인덱스 하나를 제외시키면 i에 2를 더한 꼴이 된다.
그래서 검사하는 문자가 대문자인 경우에는 기존의 배열에서 제외시키되, 인덱스에 1만큼 더해지도록 i-- 를 해주었다.

마지막에는 spread연사자를 통해서 두 배열을 [...소문자배열, ...대문자배열] 로 합친 배열을 만들었다. 이 배열을 join()을 이용하여 문자열로 변환 후 반환한다.

📍 나의 풀이 문제점

: sort() 메소드를 대소문자의 차순을 포함한 모든 정렬이 끝났다. 하지만 대소문자를 구별하여 따로 배열을 만들고 이 배열을 다시 기존의 배열과 합치는 과정 등 불필요한 코드가 너무 많이 들어갔다.

- Array.splice()

: 배열의 기존 요소를 삭제 또는 교체하거나 새 요소를 추가하여 배열의 내용을 변경합니다.

array.splice(start [, deleteCount [, item1 [, item2 [, ...]]]])

  • 매개변수
    • start
      : 배열의 변경을 시작할 인덱스입니다.
      : 배열의 길이보다 큰 값이라면 실제 시작 인덱스는 배열의 길이로 설정됩니다. (값의 절대값이 배열의 길이 보다 큰 경우 0으로 설정됩니다.)
      : 음수인 경우 배열의 끝에서부터 요소를 세어나갑니다(원점 -1, 즉 -n이면 요소 끝의 n번째 요소를 가리키며 array.length - n번째 인덱스와 같음).
    • deleteCount (Optional)
      배열에서 제거할 요소의 수입니다.
      deleteCount를 생략하거나 값이 array.length - start보다 크면 start부터의 모든 요소를 제거합니다.
      deleteCount가 0 이하라면 어떤 요소도 제거하지 않습니다. 이 때는 최소한 하나의 새로운 요소를 지정해야 합니다.
    • item1, item2, ... (Optional)
      배열에 추가할 요소입니다. 아무 요소도 지정하지 않으면 splice()는 요소를 제거하기만 합니다.
  • 반환 값
    제거한 요소를 담은 배열. 하나의 요소만 제거한 경우 길이가 1인 배열을 반환합니다. 아무 값도 제거하지 않았으면 빈 배열을 반환합니다.

📍 다른 풀이 #1

function solution(s) {
  return s
    .split("")
    .sort()
    .reverse()
    .join("");
}

- sort()

: sort() 메서드는 배열의 요소를 적절한 위치에 정렬한 후 그 배열을 반환합니다

  • 매개변수
    compareFunction | Optional
    정렬 순서를 정의하는 함수. 생략하면 배열은 각 요소의 문자열 변환에 따라 각 문자의 유니 코드 코드 포인트 값에 따라 정렬됩니다.

  • compareFunction이 없으면 오름차순 정렬.

반환 값
: 잘라낸 원소들로 만든 새로운 배열을 리턴합니다.


array.sort((a,b)=>b-a); 를 통해서 내림차순으로 배치할 수 있지만,
array.sort().reverse(); 로 간략하게 쓸 수 있다.


profile
함께 일하고 싶은 개발자를 목표로 매일을 노력하고, 옷을 좋아하는 권기현 입니다.

0개의 댓글