Code Wars Kata "Replace With Alphabet Position"

박상록(Sangrok Park)·2020년 11월 23일
0

알고리즘(Algorithm)

목록 보기
2/4

Image source: https://www.klipfolio.com/blog/algorithm-in-six-steps

문제

주어진 문자열의 모든 문자를 alphatbet 순서로 replace 하시오.
text안에 문자가 아닌 것들은 무시하고, 리턴하지 마시오.

예) "a" = 1, "b" = 2, etc.


// Example

alphabetPosition("The sunset sets at twelve o' clock.")
Should return "20 8 5 19 21 14 19 5 20 19 5 20 19 1 20 20 23 5 12 22 5 15 3 12 15 3 11" (as a string)

나의 답

function alphabetPosition(text) {
  let newText = '';
  
  for(let letter of text) {
    newText += letter.toUpperCase();
  }
  
  let result = "";
  
  for(let i = 0; i < newText.length; i++) {
    let asciiCode = newText.charCodeAt(i);
    
    if(asciiCode >= 65 && asciiCode <= 90) {
       result = result + " " + (asciiCode - 64);
    }
  }
  return result.substring(1, result.length);
}

이전에 코드스테이츠 코플릿 문제에서 알파벳관련 문제가 나와, 그 때는 알파벳들을 쭉 나열해 놓고 인덱스를 골라서 썼었는데, 오늘은 다른 방법으로 풀고 싶어서 아스키 코드를 이용해 풀어보았다. 일단 저번에 내 방법보다는 좋아서 약간 뿌듯해 질려고 했는데, 다른 분들 답을보고 경악을 했다..

Best Solution #1

정규표현식/[a-z]/로 알파벳만 match시키고 gi를 이용하여 case insensitive를 만들고, map()으로 아스키코드 매칭... 그냥... 미친 것 같다.

function alphabetPosition(text) {
  return text
    .toUpperCase()
    .match(/[a-z]/gi)
    .map( (c) => c.charCodeAt() - 64)
    .join(' ');
}

Best Solution #2

function alphabetPosition(text) {
  var result = "";
  for (var i = 0; i < text.length; i++){
    var code = text.toUpperCase().charCodeAt(i)
    if (code > 64 && code < 91) result += (code - 64) + " ";
  }

  return result.slice(0, result.length-1);
}

내 로직과 비교하면?

두번째 로직을 보니, 내가 썼던 답과 로직은 다르지 않았다. 다만, 내 것은 답은 나왔지만 패착이 하나 있었는데, toUpperCase() 메소드 기능을 정확히 숙지 하지 못한 것. 이 메소드는 text.toUpperCase() 이렇게 한번만 써줬어도 됐던 거였는데, 나는 이걸 반복문으로...😫
이것 하나로 시간복잡도가 벌써 두배로 늘어났기 때문에 메소드의 기능을 정확히 숙지해야겠다는 생각을 하게 됐다.

첫번재 로직은 정규표현식(regex)사용으로 인해 나에게 새로운 눈을 열어 준 것 같다. 나중에 알고보니 이 로직에서 정규표현식을 .match(/[A-Z]/g)라고 써도 된다는 걸 알게 됐는데(아예 처음부터 대문자로 매칭), 이게 다 첫번째 로직 덕분이다... 하하

재밌었다!

2020.11.27에 추가: 나중에 알게된 사실인데, 정규표현식(regex)보다, if문으로 charCodeAt()을 써서 구별해서 작성하는 것이 성능면에서는 훨씬이득이라고 한다. 정규표현식이 대략 50% 느리다고 한다.

문제 출처 : www.codewars.com

profile
한 줌의 소금과 같이 되고 싶은 개발자

0개의 댓글