프로그래머스 Lv1
문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수, solution을 완성해주세요.
s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다.
str은 길이 1 이상인 문자열입니다.
s | return |
---|---|
"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(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인 배열을 반환합니다. 아무 값도 제거하지 않았으면 빈 배열을 반환합니다.
function solution(s) { return s .split("") .sort() .reverse() .join(""); }
: sort() 메서드는 배열의 요소를 적절한 위치에 정렬한 후 그 배열을 반환합니다
매개변수
compareFunction | Optional
정렬 순서를 정의하는 함수. 생략하면 배열은 각 요소의 문자열 변환에 따라 각 문자의 유니 코드 코드 포인트 값에 따라 정렬됩니다.
compareFunction이 없으면 오름차순 정렬.
반환 값
: 잘라낸 원소들로 만든 새로운 배열을 리턴합니다.
⇨
array.sort((a,b)=>b-a); 를 통해서 내림차순으로 배치할 수 있지만,
array.sort().reverse(); 로 간략하게 쓸 수 있다.