競技プログラミング奮闘記LeetCode:Easy 500. Keyboard Row


皆さん、こんにちは。中川@ナマポエンジニアです。

何日前かにLeetCodeの問題を解きましたので、早速noteに書きとどめておこうと思います。

少しユニークな問題で面白そうでしたので、取り掛かってみました。「Keyboard Row」という問題です。

与えられた文字が、キーボードの一列だけで取得できるかを判定するロジックを書く必要があります。(※詳細は文字列が格納された配列です)

PCのキーボードの構成は以下のようになっています。(ローマ字以外だけで構成されている列は除く)

一列目:「q,w,e,r,t,y,u,i,o,p」
二列目: 「a,s,d,f,g,h,j,k,l」
三列目: 「z,y,c,v,b,n,m」

与えられた文字が、helloだとしましょう。hは、二列目ですがeは一列目です。この時点では一列だけで文字を完成できませんので、helloは、一列だけでは文字を完成できないということになります。

alaskaの場合はどうでしょう。全ての文字が二列目ですので、一列だけで文字を完成できます。正答率は60%ありますので、そんなに難しくはありませんが、ユニークな問題だったのでご紹介しました。ただ、この問題を考えた人は、頭が良くて面白い方だなあと思いますww

私が書いたコード(JS)

var exsitRow = (str) => {
   let lowerStr = str.toLowerCase()
   let array1 = ["q","w","e","r","t","y","u","i","o","p"]
   let array2 = ["a","s","d","f","g","h","j","k","l"]
   let array3 = ["z","x","c","v","b","n","m"]
   
   if(array1.includes(lowerStr)){
       return "1"
   } else if(array2.includes(lowerStr)){
       return "2"
   } 
   return "3"
}
var findWords = function(words) {
   let array = []
   for(let word of words){
       let lenWord = word.length
       let isTrue = true
       let order = exsitRow(word[0])
       for(let i = 1; i < lenWord; i++){
           if(order !== exsitRow(word[i])){
              isTrue = false
              break
           }
       }
       
       if(isTrue){
           array.push(word)
       }
   }
   return array
};

うーん、ソースコードが長くて汚いww

ただ、処理速度は問題なかったので、良しとしましょう!

一番処理速度が速い人のコード

const findWords = (words) => {
   const letterLocation = {
       "q": 5,
       "w": 5,
       "e": 5,
       "r": 5,
       "t": 5,
       "y": 5,
       "u": 5,
       "i": 5,
       "o": 5,
       "p": 5,
       "a": 7,
       "s": 7,
       "d": 7,
       "f": 7,
       "g": 7,
       "h": 7,
       "j": 7,
       "k": 7,
       "l": 7,
       "z": 2,
       "x": 2,
       "c": 2,
       "v": 2,
       "b": 2,
       "n": 2,
       "m": 2,
   }
   let finalArr = []
   for (let i = 0; i < words.length; i++) {
       let counter = 0
       let baseNum = words[i].length
       let wordLowercase = words[i].toLowerCase()
       for (let j = 0; j < wordLowercase.length; j++) {
           counter += letterLocation[wordLowercase[j]]
       }
       if (counter === baseNum * 5 || counter === baseNum * 7 || counter === baseNum * 2) {
           finalArr.push(words[i])
           counter = 0
       }
   }
   return finalArr
}

上記コードは、一番処理速度が速かった人のコードです。なるほど、連想配列で何列目かを取得していますね。私が言うのも何ですが、シンプルで良いコードです。

今後も、競技プログラミングについてのnoteを書いていきますので、よろしくお願いします。何か間違っている所や、問題点がありましたらコメントしていただけると幸いです。


この記事が気に入ったらサポートをしてみませんか?