3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CodeWars オススメ問題 #4

Posted at

はじめに

個人的に好きなアルゴリズム学習サイト「CodeWars」の問題をシェア。

週1くらいのペースで、全10回を目指す予定。

CodeWarsはいいぞ!の紹介はこちら

CodeWarsの始め方はこちら

オススメ問題

問題

与えられた文字列にxoが同数含まれているかを返す問題です。
含まれていない場合は0としてカウントします。

XO("ooxx") => true
XO("xooxx") => false
XO("ooxXm") => true
XO("zpzpzpp") => true // when no 'x' and 'o' is present should return true
XO("zzoo") => false

難易度

分類は 7kyu です。
アルゴリズム問題に慣れてきた方にオススメです。

オススメの回答

「評価が高い回答」の中から、学びの多い回答をピックアップしてご紹介。

オーソドックスな解法
const XO = str => {
  str = str.toLowerCase().split('');
  return str.filter(x => x === 'x').length === str.filter(x => x === 'o').length;
}
  • アロー関数const XO = str => {}という記法が用いられています
    function XO(str) {}と意味はほぼ同じです
  • filterを使って、'x'に一致するもの、'o'に一致するものの数を出し、比較しています
オーソドックスな解法(正規表現)
function XO(str) {
  let x = str.match(/x/gi);
  let o = str.match(/o/gi);
  return (x && x.length) === (o && o.length);
}
  • /x/giは、xに一致する全て(/g)に、大文字小文字の区別無し(/i)でマッチします
個人的に好きな回答
function XO(str) {
    var a = str.replace(/x/gi, ''),
        b = str.replace(/o/gi, '');
    return a.length === b.length;
}

先程の正規表現との違いは、matchではなくreplaceメソッドを使用していることです。

matchの場合、マッチしたものが存在しない時、存在しないものに対しlengthメソッドが使用されエラーになります。

replaceを使用することにより、マッチしなくとも元の文字列に対しlengthが使用されるため、エラーにはなりません。

よって、よりスマートなコードになっています。

ただし、replaceはパット見何をしているかわかりません。意図の伝わりやすさという点でmatchを使用するのが一般的でしょう。

おわりに

以上、CodeWarsオススメ問題でした。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?