조건은 문자열을 내림차순으로 배치하는 것
알파벳이 주어지는데 대신 소문자>대문자 이고 내림차순으로 정렬하면 된다.
function solution(s) {
var answer = '';
const Alphabet = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','o','p','q','r','s','t','u','v','w','x','y','z']
let add = '';
let isBigOne = [];
let smallOne = [];
answer = s.split('').reverse()
for(let i = 0; i<answer.length;i++){
let a = answer[i]
let b = Alphabet.findIndex(e=>e===a)
if(b === -1){
isBigOne.push(answer[i])
}else{
smallOne.push(answer[i])
}
}
isBigOne=isBigOne.sort().reverse()
smallOne=smallOne.sort().reverse()
answer = smallOne.concat(isBigOne)
for(let j = 0; j<answer.length;j++){
add += answer[j]
}
return add;
}
꽤나 복잡하게 풀었는데 콘솔찍었을때 그냥 reverse 를 했을때
대문자 들이 반대로 적용되서 분리하느냐고 한번더 돌아가게 되었다.
일단 대문자와 소문자를 분리 하는데 거창하게 했다.
그리고 분리한 값들을 정렬하고 다시 합쳐준다.
다른 사람의 풀이를 봤다
function solution(s) {
return s
.split("")
.sort()
.reverse()
.join("");
}
간단하며 깔끔했다 그냥 정렬하고 리버스를 하면 되었는데 그냥 리버스 함수만 써서 잘못된것 같다.
그리고 join() 에 대해서 알게 되었다.
나는 for문을 사용해서 배열의 값 하나하나를 합쳐줬는데 더 쉬운 메소드가 있었다니
내 로직에 아래 for문을 제거 하고 join을 넣으면 이렇게 된다
function solution(s) {
var answer = '';
const Alphabet = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','o','p','q','r','s','t','u','v','w','x','y','z']
let isBigOne = [];
let smallOne = [];
answer = s.split('').reverse()
for(let i = 0; i<answer.length;i++){
let a = answer[i]
let b = Alphabet.findIndex(e=>e===a)
if(b === -1){
isBigOne.push(answer[i])
}else{
smallOne.push(answer[i])
}
}
isBigOne=isBigOne.sort().reverse()
smallOne=smallOne.sort().reverse()
answer = smallOne.concat(isBigOne).join("")
return answer;
}
for문을 두번 돌려야 해서 성능상에 조금 느려질까 우려도 했었는데
join하나 알고 간다.
reverse를 하면 내림차순으로 그냥 정렬되는줄 알았는데 그냥 문장을 뒤바꾸는 것이었다.
정렬 sort를 쓰고 reverse 를 쓰면 내림차순으로 정렬된다.