🚀 기능 요구 사항 어느 연못에 엄마 말씀을 좀처럼 듣지 않는 청개구리가 살고 있었다. 청개구리는 엄마가 하는 말은 무엇이든 반대로 말하였다.
엄마 말씀 word가 매개변수로 주어질 때, 아래 청개구리 사전을 참고해 반대로 변환하여 return 하도록 solution 메서드를 완성하라.
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
Z
Y
X
W
V
U
T
S
R
Q
P
O
N
M
L
K
J
I
H
G
F
E
D
C
B
A
제한사항
word는 길이가 1 이상 1,000 이하인 문자열이다.
알파벳 외의 문자는 변환하지 않는다.
알파벳 대문자는 알파벳 대문자로, 알파벳 소문자는 알파벳 소문자로 변환한다.
실행 결과 예시
word
result
“I love you”
“R olev blf”
내 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 function problem4 (word ) { if (typeof word !== 'string' ) throw new TypeError ('매개변수는 문자열 타입이여야 합니다.' ); if (!word.length || word.length > 1000 ) throw new RangeError ('매개변수는 1 이상 1,000 이하의 문자열이여야 합니다.' ); const ALPHABET_LENGTH = 26 ; const ASCII_NUMBER_CODE_UPPER_A = 65 ; const ASCII_NUMBER_CODE_UPPER__Z = 90 ; const ASCII_NUMBER_CODE_LOWER_A = 97 ; const ASCII_NUMBER_CODE_LOWER__Z = 122 ; const splitWords = [...word]; const uppers = Array .from ({length :ALPHABET_LENGTH }, (_,i ) => String .fromCharCode (ASCII_NUMBER_CODE_UPPER_A +i)); const lowers = Array .from ({length :ALPHABET_LENGTH }, (_,i ) => String .fromCharCode (ASCII_NUMBER_CODE_LOWER_A +i)); const changeOppositeStr = str => { const codePosition = str.charCodeAt (); return (codePosition >= ASCII_NUMBER_CODE_UPPER_A && codePosition <= ASCII_NUMBER_CODE_UPPER__Z ? [...uppers].reverse ()[uppers.indexOf (str)] : codePosition >= ASCII_NUMBER_CODE_LOWER_A && codePosition <= ASCII_NUMBER_CODE_LOWER__Z ? [...lowers].reverse ()[lowers.indexOf (str)] : str); } return splitWords.map (splitedWord => changeOppositeStr (splitedWord)).join ('' ); }
ASCII 코드를 활용하여 AZ, az 를 담은 배열을 생성하였다.
map 메서드를 사용하여 각 요소를 반대편 문자열로 바꿔주었다.
🏓 소감
리팩터링을 하기 전 코드는 ASCII 코드를 상수에 할당하지 않고 그대로 비즈니스 로직에 가져다가 사용하지 해당 숫자가 무엇을 의미하는지 파악하기 힘들어 상수에 할당하니 가독성이 높아졌다.
changeOppositeStr() 함수 내부에서 reverse()[] 이 부분이 중복되어 함수로 추출하려 했지만, 짧은 코드에 너무 많은 함수가 오히려 더 가독성을 해친다고 판단하여 그대로 두었다.
로직을 ASCII 코드 대신 정규표현식으로 구현하였다면 비즈니스 로직이 훨씬 더 간결해질 것 같기에 다음에 문자열 문제가 나온다면 정규표현식으로도 도전해봐야겠다.