주어진 string 알파벳에 숫자가 주어지고 숫자만큼 알파벳을 민다. A ,1 이라면 B로 숫자를 미는 것이다.
단 공백이 주어지면 공백은 아무리 밀어도 공백이다.
대문자일 경우 대문자로 밀고 소문자일 경우 소문자로 민다.
대소문자만 없으면 간단하게 풀수 있을것 같은데 나뉘어져 있어서 같은 식을 반복하여 작성하게 되었다.
나의 풀이는 이렇다 .
function solution(code,n){
let answer = ''
const Alphabet = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
let codeArr = code.split('');
answer = codeArr.map(x=> {
let codeToNum = ''
if(x == ' '){
return codeToNum = ' '
}
codeToNum = Alphabet.findIndex((y)=>{return y === x})
if(codeToNum === -1){
x = x.toLowerCase()
codeToNum = Alphabet.findIndex((y)=>{return y === x})
codeToNum += n;
if(codeToNum>=26){
codeToNum -= 26
}
codeToNum= Alphabet[codeToNum]
codeToNum= codeToNum.toUpperCase()
}else{
codeToNum += n;
if(codeToNum >= 26){
codeToNum -= 26
}
codeToNum= Alphabet[codeToNum]
}
return codeToNum
})
return answer.join('')
}
map을 이용하여 풀게 되었다. 처음에 그냥 charAt을 쓰고 풀려다가 map으로 풀수 있을것 같아서 map으로 바꾸어서 풀었다.
다른 사람의 풀이 이다.
`
function solution(s, n) {
var upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var lower = "abcdefghijklmnopqrstuvwxyz";
var answer= '';
for(var i =0; i <s.length; i++){
var text = s[i];
if(text == ' ') {
answer += ' ';
continue;
}
var textArr = upper.includes(text) ? upper : lower;
var index = textArr.indexOf(text)+n;
if(index >= textArr.length) index -= textArr.length;
answer += textArr[index];
}
return answer;
}
`
여기서 훑어 보다가 string도 []로 각 값들을 접근할수 있다는 것을 처음알게 되었다.
string값들을 가져오기 위해서 나는 split으로 배열로 각각 만들어서 접근을 하였는데
바로 접근이 가능하였다. 이것만 알아도 한두줄 정도는 코드는 줄일수 있을 것 같다.
나는 배열이라서 filter()를 사용하였고 이 분은 includes 함수를 사용하였다.
나는 소문자 알파벳들만 정의를 해놓아서 소문자로 바꾸고 대문자로 변경하고 했는데
기존에 대 소 문자 둘다 정의를 해놓았으면 바꾸는 코드가 필요 없을것 같다.
그래서 아래처럼 내 코드를 수정해 봤다.
function solution(code,n){
let answer = ''
let SmallAlphabet = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
const BigAlphabet = ['A','B','C','D','E','F','G','H','I','J','K','L',"M",'N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
let codeArr = code.split('');
answer = codeArr.map(x=> {
let codeToNum = ''
if(x == ' '){
return codeToNum = ' '
}
Alphabet = SmallAlphabet
codeToNum = Alphabet.findIndex((y)=>{return y === x})
if(codeToNum === -1){
Alphabet = BigAlphabet
codeToNum = Alphabet.findIndex((y)=>{return y === x})
}
codeToNum += n;
if(codeToNum >= 26){
codeToNum -= 26
}
codeToNum= Alphabet[codeToNum]
return codeToNum
})
return answer.join('')
}
대문자를 정의해 주고 로직을 돌렸는데 성능상 큰 차이는 없는것 같다 (테스트 속도가 비슷하다. 수정전이 좀더 빠른것 같기도 하다 )
오늘도 한문제 해결