keyboardRow

leetcode 문제링크

Given a List of words, return the words that can be typed using letters of alphabet on only one row’s of American keyboard like the image below.

Example 1:

  • Input: [“Hello”, “Alaska”, “Dad”, “Peace”]
  • Output: [“Alaska”, “Dad”]

Note:

  • You may use one character in the keyboard more than once.
  • You may assume the input string will only contain letters of alphabet.

나의 풀이

every메소드를 써서 키보드 배열 중 모든 문자열이 속하는 배열이 있는 지 확인하는 부분에서 반복문을 쓸까 하다가 키보드 배열의 값은 변경될 일이 없을 것 같고 반복문 쓰면서 every의 반환값을 어딘가에 저장해두는 것이 더 좋은 방법 같지는 않아서 다음과 같이 풀었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 48ms
const keyboard = [
['Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P'],
['A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L'],
['Z', 'X', 'C', 'V', 'B', 'N', 'M'],
];

var findWords = function(words) {
return words.filter(item => {
const itemArr = item.toUpperCase().split('');
return itemArr.every(item => keyboard[0].includes(item)) ||
itemArr.every(item => keyboard[1].includes(item)) ||
itemArr.every(item => keyboard[2].includes(item));
})
};

정규식이랑 match() 메소드, some()메소드를 이용해 다른 방법으로 풀어보았다. result에 한번 match의 반환값을 저장할 필요가 있었는데, join()으로 다시 문자열 결합할 때, match의 반환값이 배열이 아니라 null일때도 있기 때문이다.

1
2
3
4
5
6
7
8
9
10
// 52ms
var findWords = function(words) {
const keyboards = [/[QWERTYUIOP]/ig, /[ASDFGHJKL]/ig, /[ZXCVBNM]/ig];
return words.filter(item => {
return keyboards.some(row => {
const result = item.match(row);
return result && result.join('') === item
});
})
};

다른 사람 풀이

정규식을 굉장히 잘 사용한 풀이인 것 같다. ^$을 이용해서 문자셋으로만 구성된 단어인지 여부를 RegExp test() 메소드를 통해서 bool값으로 반환하도록 했다.

1
2
3
4
5
6
7
8
9
10
11
12
var findWords = function(words) {
return words.filter((w) => {
// remove word from array if it fails matching all three rows
if (
!/^[qwertyuiop]*$/i.test(w) &&
!/^[asdfghjkl]*$/i.test(w) &&
!/^[zxcvbnm]*$/i.test(w)
) return false;

return true;
});
};

Share Comments