Given a string s consisting of words and spaces, return the length of the last word in the string.
A word is a maximal substring consisting of non-space characters only.
단어와 공백으로 이루어진 문자열이 주어지면, 문자열의 마지막 단어의 길이를 반환하는 문제.
공백으로만 이루어진 것은 단어가 아님.
Input: s = "Hello World"
Output: 5
Explanation: The last word is "World" with length 5.
Input: s = " fly me to the moon "
Output: 4
Explanation: The last word is "moon" with length 4.
Input: s = "luffy is still joyboy"
Output: 6
Explanation: The last word is "joyboy" with length 6.
문자열은 알파벳과 공백으로만 이루어져있으며 길이는 1 이상 104 이하이다.
적어도 하나의 단어를 포함하고 있다.
trim()
메서드로 맨앞과 맨뒤의 공백을 제거split()
메서드로 공백을 기준으로 문자열 나누기// Runtime: 62 ms, faster than 93.90%
// Memory Usage: 42.3 MB, less than 19.50%
var lengthOfLastWord = function(s) {
const words = s.trim().split(" ");
return words[words.length - 1].length;
};
재귀 함수 연습을 위해 재귀로도 풀어봤다.
1. 문자열 내의 마지막 공백을 찾는다.
2. 마지막 공백이 마지막 인덱스면, 마지막 공백 이전까지만 문자열을 자른 값을 인수로 전달한 재귀 함수 호출
3. 마지막 공백의 인덱스가 마지막 인덱스가 아니면 재귀를 멈추고, 마지막 공백의 다음 인덱스부터 자른 문자열 반환
// Runtime: 82 ms, faster than 60.24%
// Memory Usage: 42.2 MB, less than 42.01%
var lengthOfLastWord = function(s) {
const lastBlank = s.lastIndexOf(" ");
if (lastBlank === s.length - 1) {
return lengthOfLastWord(s.substring(0, lastBlank));
}
return s.substring(lastBlank + 1).length;
};
trim().split(" ")
까지의 접근은 같지만 마지막 요소를 반환하는 pop()
또는 음수 인덱싱이 가능한 at()
을 사용하여 한 줄로 표현한 풀이.
var lengthOfLastWord = function(s) {
return s.trim().split(" ").pop().length;
};
var lengthOfLastWord = function(s) {
return s.trim().split(" ").at(-1).length;
};
split()
대신 lastIndexOf()
를 사용한 풀이.
var lengthOfLastWord = function(s) {
s = " " + s.trim();
return s.length - s.lastIndexOf(" ") - 1;
};
정규식을 사용한 풀이
(하나 이상의 word 문자((\w+)
) + 있거나 없는 공백(\s*
))와 일치하는 문장의 끝부분($
) 찾기.
공백을 제외한 단어를 저장하기 위해 하나 이상의 word 문자 부분만 ()
로 그룹 설정.
match()
메서드가 반환하는 배열의 인덱스 0의 값은 패턴과 일치하는 부분 전체고,
인덱스 1의 값은 설정한 group #1 (\w+)
에 해당하는 값이므로 인덱스 1의 길이 반환.
var lengthOfLastWord = function(s) {
return s.match(/(\w+)\s*$/)[1].length;
};
at()
은 자바스크립트가 올해 6월에 발표한 신기능이다.
syntax
at(index)
array.at(3) === array[3]
배열의 모든 인덱스에 접근 가능하다.
위의 예제만 보면 대괄호로 접근하는 방식과 같아 보이겠지만 큰 차이점이 있다.
array.at(-1) === array[array.length - 1]
array.at(-2) === array[array.length - 2]
at()
은 뒤에서부터 거꾸로 접근하는 음수 인덱싱이 가능하다는 것!
[array.length - n]
와 비교하면 가독성이 훨씬 좋다.
패턴 내에서 따로 필요한 부분을 그룹으로 설정해두면, 그룹 넘버(1~)에 맞는 인덱스로 접근하여 해당하는 값만 얻을 수 있다.
group #1: (\w+)
let s = " fly me to the moon ";
let regExp = /(\w+)\s*$/;
console.log(s.match(regExp));
/* ->
[
'moon ',
'moon',
index: 21,
input: ' fly me to the moon ',
groups: undefined
]
*/
console.log(s.match(regExp)[0]); // 'moon '
console.log(s.match(regExp)[1]); // 'moon'
*/