본문 바로가기
알고리즘/CodeWars

[CodeWars] javascript - 6kyu - Replace With Alphabet Position 문제풀이

by TLOWAC 2020. 4. 29.

Title

Replace With Alphabet Position

DescriptionWelcome.

In this kata you are required to, given a string, replace every letter with its position in the alphabet.

If anything in the text isn't a letter, ignore it and don't return it.

"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)


How Can I Solved

문제 요구사항 정의

함수의 인자로 문자열이 주어진다.

알파벳의 위치에 따른 숫자로 반환하면 된다.


알파벳 위치에 따른 숫자값 예시

'a' = '1',
'b' = '2',
'c' = '3',
.
.

실제 출력값 예시

function alphabetPosition("The sunset sets at twelve o' clock.")

"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")

주의 사항

'a' 와 'A' 는 둘다 1로 표시된다.
즉, 대소문자 관계없다.


문제 접근

문제를 푸는 방법에는 크게 2가지가 있다.

하나는 정규표현식을 사용하는 방법이다.
다른 하나는 Dictionary를 사용하는 방법이다.

나는 여기서 Dictionary를 사용하는 방법으로 문제를 풀었다.

입력되는 문자열을 전부 소문자로 변경

혹시나 문자열에 대문자 와 소문자가 혼합된 경우,
잘못된 값이 나올 수 있기 때문에 전부 소문자로 변경하는 작업이 필요하다.

  text.toLowerCase()

입력되는 문자열의 공백을 없앤다.

인자로 받는 문자열에 공백이 포함된 경우,
이후 split()으로 문자열을 하나씩 구분했을때 문제가 발생할 수 있다.

' ' 공백 또한 하나의 문자로 인식 되기 때문이다.

  text.replace(' ','')

문자열을 문자 하나씩 나눈다.

이후에 map() 메서드를 사용하기 위해서 split() 메서드를 사용한다.
split() 메서드를 사용하면, 배열에 문자열이 한문자씩 나뉘어서 담긴다.

예시

"test".split('')
['t', 'e', 's', 't']
  text.split('')

키값 포함 여부 확인 및 결과값 저장

split() 메서드를 통해서 하나씩 나뉜 문자를 가지고 map() 메서드의 인자로 활용한다.
Dictionary 에 하나씩 나뉜 문자가 있는 경우 result[]에 push 한다.

.map(
    value=> 
    value in alphaKeyStacks ? result.push(alphaKeyStacks[value]) : ''
  )

결과 값들 사이에 공백 추가

result[] 에 숫자가 저장되어 있다.
배열에 담긴 숫자들 사이사이에 join() 메서드를 사용해서 ' ' 공백으로 이어 준다.

  return result.join(' ')


Solution

function alphabetPosition(text) {
  var alphaKeyStacks={
  'a':'1','b':'2', 'c':'3', 
  'd':'4','e':'5','f':'6', 
  'g':'7','h':'8','i':'9', 
  'j':'10','k':'11','l':'12', 
  'm':'13','n':'14','o':'15', 
  'p':'16','q':'17','r':'18', 
  's':'19','t':'20','u':'21', 
  'v':'22','w':'23','x':'24', 
  'y':'25','z':'26'
  }

  var result=[]

  text.toLowerCase()
  .replace(' ','')
  .split('')
  .map(
    value=> 
    value in alphaKeyStacks ? result.push(alphaKeyStacks[value]) : ''
  )

  return result.join(' ')
}

Another Solution with Regular Expression

정규 표현식을 사용하면 아래와 같이 축약 시킬 수 있다.

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

댓글