-
Pythonで与えられた数が完全平方数かどうかを判定する方法
ある数 n が与えられたとき、その数が完全平方数(perfect square)であるかどうかを判定します。完全平方数とは、その数の平方根が整数になる数のことです。 例えば、入力が n = 36 の場合、36 = 6 × 6 となるため、結果は True になります。 解決の手順 n の平方根を計算し、その整数部分を取得する その整数を2乗した値が元の n と一致すれば True、そうでなければ False を返す 実装例 以下のコードで実際に確認してみましょう。 from math import sqrt def solve(n): sq_root = int(sqrt(n
-
BeautifulSoupパッケージを使ってPythonでWebページからデータを解析する方法
BeautifulSoupは、Webページからデータを解析(パース)するために使われるPythonのサードパーティ製ライブラリです。Webスクレイピング、すなわちさまざまなリソースからデータを抽出・利用・加工する一連のプロセスを支援します。Webスクレイピングは、研究目的のデータ収集だけでなく、市場トレンドの把握や比較、SEOモニタリングなど、幅広い用途に活用できます。Windows環境にBeautifulSoupをインストールするには、以下のコマンドを実行します。pip install beautifulsoup4実行例を見てみましょうサンプルコードimport requests from
-
BeautifulSoupを使ってWebページからタイトルを抽出する方法【初心者向け解説】
BeautifulSoupは、Webページからデータを解析(パース)するために使われるPythonのサードパーティ製ライブラリです。開発者が自然言語処理アプリケーションを構築する際に役立ち、収集したデータの分析や、そこから意味のあるインサイトを抽出することを支援します。自然言語処理(NLP:Natural Language Processing)は機械学習の一分野であり、テキストデータを扱い、それを機械学習モデルへの入力として供給できるように前処理する手法を研究対象とします。また、Webスクレイピングは研究目的でのデータ収集だけでなく、市場トレンドの把握や比較、SEOモニタリングなど、さまざま
-
Pythonで文字列を4つの異なる部分文字列に分割できるかどうかを判定する方法
問題の概要 文字列 s が与えられたとき、それを空でなく、かつ互いにすべて異なる4つの部分文字列に分割できるかどうかを判定するのが、この記事のテーマです。 たとえば入力が s = helloworld の場合、[hel, lo, wor, ld] のように4つの異なる部分文字列へ分割できるため、出力は True になります。 解法の考え方 この問題は以下の手順で解くことができます。 文字列の長さが 10 以上であれば、即座に True を返す(理由は後述) 長さが 10 未満の場合は、分割位置となる 3 つの境界 i、j、k を全探索する 各組み合わせで 4 つの部分文字列を作成し、すべて
-
BeautifulSoupを使ってWebサイトからhrefリンクを抽出する方法
BeautifulSoupは、Webページからデータを解析(パース)するために使われるPythonのサードパーティ製ライブラリです。さまざまなソースからデータを抽出・加工・活用する「Webスクレイピング」を行う際に非常に役立ちます。Webスクレイピングは、研究目的のデータ収集だけでなく、市場トレンドの把握や比較、SEOモニタリングなど、幅広い用途で活用されています。BeautifulSoupのインストールWindows環境にBeautifulSoupをインストールするには、以下のコマンドを実行します。pip install beautifulsoup4実装例:hrefリンクの一括取得以下は、W
-
Pythonで配列の要素を繰り返し使って指定した合計値を作れるか判定する方法
nums という配列ともうひとつの値 sum が与えられたとします。このとき、nums に含まれる要素を足し合わせて sum を作ることができるかどうかを判定します。なお、同じ要素は何度でも選んでよいものとします。 たとえば、入力が nums = [2, 3, 5]、sum = 28 の場合、出力は True になります。これは 5 + 5 + 5 + 5 + 3 + 3 + 2 = 28 という組み合わせで合計を作れるためです。 解法のアプローチ この問題は、「その合計値が作れるかどうか」を動的計画法(DP)の要領でテーブルに記録しながら求めることで解けます。手順は以下の通りです。 MA
-
Pythonで「A」と「B」の移動制約のもと、ある文字列を別の文字列へ変換できるか判定する方法
問題の概要 「A」「B」「#」の3種類の文字だけで構成された2つの文字列 s と t が与えられます。ここで、次のルールに従う操作によって s を t へ変換できるかどうかを判定するのが、この記事のテーマです。 「A」は左方向にしか移動できない 「B」は右方向にしか移動できない 「A」と「B」は互いに交差(追い越し)できない 例として、s = ##AB##B、t = A###B#B という入力を考えてみましょう。この場合の出力は True になります。s 内の A は左端の位置へスムーズに移動でき、中央の B も1ステップ右へ動けるためです。 解法の考え方 この問題は、貪欲法(グリーディ
-
Pythonで数値Nから回文文字列を作成できるか判定する方法
問題の概要 ある数値 n が与えられたとき、その数値をもとに小文字アルファベットだけで構成される文字列を作成し、その文字列が回文(前から読んでも後ろから読んでも同じ文字列)になっているかどうかを判定します。 ここで使用できる文字は a から j までに限定され、各文字は次のように数字に対応付けられます。[a = 0, b = 1, c = 2 ... j = 9] 例えば、数値が 42 の場合、各桁の合計は 4 + 2 = 6 となるため、対応する文字列「ec」を繰り返して 6 文字の「ececec」を生成し、これが回文かどうかを確認します。 入力が n = 43 の場合、出力は True に
-
Pythonで指定した角度の正多角形を作成できるかどうかを判定する方法
ある角度 a が与えられたとき、その角度をすべての内角とする正多角形を作成できるかどうかを判定する問題を考えてみましょう。 例えば、入力が a = 120 の場合、出力は True になります。これは、正五角形のすべての内角がちょうど120°だからです。 考え方:内角と辺の数の関係 正n角形の内角は、次の公式で求められます。 内角(a) = 180 × (n − 2) ÷ n この式を n について解くと、次のようになります。 n = 360 ÷ (180 − a) ここで計算した n(辺の数)が整数になれば、その角度を持つ正多角形が存在することになります。逆に小数になる場合は、その角度をすべ
-
Pythonで指定されたn辺の多角形(ポリゴン)を作成できるかどうかを判定する方法
長さ n の辺の長さが格納された配列 nums が与えられたとします。このとき、与えられたすべての辺を使って多角形(ポリゴン)を作成できるかどうかを判定する必要があります。例えば、入力が nums = [3, 4, 5] の場合、出力は True になります。これは3つの辺があり、どの2辺の和も残りの1辺より大きいためです。この問題を解くには、「ある一辺の長さは、それ以外のすべての辺の長さの総和より小さい」という性質を利用します。解法のアプローチこの問題は、以下の手順で解くことができます。リスト nums をソートするnums の最後の要素(最大値)が、それ以外の要素の総和より小さい場合は T
-
Pythonで指定した方向余弦から直線を描けるかどうかを判定する方法
3次元空間において、3つの方向余弦 l、m、n が与えられたとします。このとき、これらの方向余弦を持つ直線が実際に描けるかどうかを判定する方法を解説します。例えば、入力が l = 0.42426、m = 0.56568、n = 0.7071 の場合、出力は True になります。これは、ベクトル {3, 4, 5} の方向余弦に一致するためです。方向余弦の基本ルール方向余弦とは、直線(またはベクトル)と各座標軸がなす角の余弦のことであり、以下の性質を持ちます。l = cos(a):a は直線と x 軸のなす角m = cos(b):b は直線と y 軸のなす角n = cos(c):c は直線と
-
Pythonで指定した制約条件下で文字列Aから文字列Bを作成できるか判定する方法
問題の概要 2つの文字列 s・t と、2つの整数 p・q が与えられます。このとき、次の条件をすべて満たして文字列 t を文字列 s から作り出せるかどうかを判定するのが本記事のテーマです。 文字列 s を先頭から p 文字ずつのグループに分割する(最後のグループのみ p 文字以下でもよい) 各グループから取り出せる文字は最大 q 個まで t に含まれる文字の並び順は、s 内での出現順序と一致していること 例として、s = mnonnopeqrst、t = moprst、p = 5、q = 2 という入力を考えてみます。この場合、答えは True になります。s は「mnonn」「opeq
-
Pythonで指定した秒数の加算・減算だけで12時ちょうどに戻れるか判定する方法
n個の異なる秒数が配列として与えられているとします。このとき、12時ちょうどの時刻から出発し、与えられた秒数を「加算」または「減算」する操作だけを使って、再び12時に戻ることができるかどうかを判定します。ただし、与えられた秒数はすべて必ず一度ずつ使用し、それぞれについて加算か減算のどちらか一方を選ぶものとします。たとえば、入力が seconds = [40, 90, 50] の場合、まず 40 を加算し、次に 90 を減算し、最後に 50 を加算すると差し引きが 0 になるため、答えは True になります。解法のアプローチこの問題は、各秒数に「+」と「−」のどちらを割り当てるかの全パターン(
-
Pythonで同じ位置の値を交換して2つの行列を狭義単調増加にできるか判定する方法
問題の概要サイズ n × m の2つの行列 mat1 と mat2 があるとします。同じ位置 (i, j) にある要素同士であれば、2つの行列の間で自由に入れ替えることができます。この操作だけを使って、両方の行列を「狭義単調増加」な行列(すべての行と列が、左から右へ、上から下へ向かって値が厳密に増加する状態)にできるかどうかを判定してください。入力例たとえば、次のような2つの行列が与えられたとします。7151610149817この場合の出力は True になります。実際、(7, 14) と (10, 17) のペアを入れ替えると、2つの行列は次のようにどちらも狭義単調増加になります。14151
-
PythonでちょうどNステップで(0, 0)から(x, y)へ移動できるか判定する方法
座標点 (x, y) と整数 n が与えられたとき、ちょうど n ステップで原点 (0, 0) から (x, y) へ移動できるかどうかを判定します。移動は上下左右の4方向のいずれかに、1回につき1ステップずつ行うことができます。例えば、入力が p = (2, 1)、n = 3 の場合、出力は True になります。右に2ステップ、上に1ステップ進むことで、合計3ステップで目的の点に到達できるからです。解法のアプローチこの問題は以下の手順で解くことができます。n が |x| + |y| 以上であり、かつ n − (|x| + |y|) が偶数である場合は True を返すそれ以外の場合は Fa
-
【Python】2種類のジャンプ幅で目標位置に到達できるか判定し、最小ステップ数を求める方法
数直線上の開始位置 p にいる状態から、左または右へ d1 または d2 単位ずつジャンプできるものとします。このとき、目標位置 q に到達するまでに必要な最小ステップ数を求めるのが、本記事で扱う問題です。 例えば、p = 5、q = 10、d1 = 4、d2 = 3 が入力として与えられた場合、答えは 3 になります。右方向へ4単位のジャンプを2回行って位置13まで進み、そこから左へ3単位ジャンプすれば位置10に到達できるためです。 解法のアプローチ:GCDによる事前チェック+BFS この問題は「最大公約数(GCD)」と「幅優先探索(BFS)」を組み合わせることで効率的に解けます。 1.
-
Pythonでベクトルxを90度回転・加算してベクトルyに到達できるか判定するアルゴリズム
2次元平面上に3つのベクトル x、y、z があるとします。ベクトル x を起点として、「90度(時計回り)の回転」または「ベクトル z の加算」を必要な回数だけ繰り返すことで、ベクトル y に到達できるかどうかを判定するのがこの問題です。 たとえば、入力が x = (-4, -2)、y = (-1, 2)、z = (-2, -1) である場合、出力は True になります。x に対して z を加算する操作と 90 度の時計回り回転を組み合わせることで、y = (-1, 2) の位置に到達できるからです。 解法のアプローチ この問題は、次の手順に沿って解くことができます。 1. util()
-
Pythonでバイナリ文字列を並べ替えて0と1が交互に並ぶようにできるか判定する方法
問題の概要 長さ2以上のバイナリ文字列 s が与えられたとき、その文字列を並べ替えることで、0と1が交互に並んだ文字列(オルタネート文字列)を作れるかどうかを判定する問題です。 例えば、入力が s = 1000111 の場合、「1」が4個、「0」が3個含まれているため、これらを並べ替えて 1010101 を作ることができます。したがって、出力は True になります。 解法の考え方 0と1が交互に並ぶ文字列では、文字列の長さによって「0」と「1」の出現回数の関係が一意に決まります。 長さが偶数の場合:「0」と「1」の出現回数は必ず等しくなります(例:0101 → 0が2個、1が2個)。 長
-
Pythonで長方形を幅の非増加順に並べ替えられるか判定する方法
各長方形が縦と横の寸法で表されたリストがあるとします。任意の長方形は90度回転できるため、回転すると縦と横の値が入れ替わります。ここで、すべての長方形の幅が非増加順(前の要素以下になっていく順序)となるように並べ替えられるかどうかを判定する問題を考えます。例えば、入力が rects = [[4, 5], [5, 7], [4, 6]] の場合、出力は True となります。初期状態では幅が [5, 7, 6] ですが、後ろの2つの長方形を回転させると幅は [5, 5, 4] となり、非増加順に並んでいることが分かります。解法のアプローチこの問題は貪欲法(グリーディ法)で効率的に解くことができま
-
Pythonで顧客の列に順番どおりチケットを販売できるか判定する方法(紙幣のお釣り問題)
問題の概要 キュー(列)に並んでいる顧客がそれぞれ持っているルピー紙幣を表す配列 notes があると仮定しましょう。彼らは全員、50ルピーのチケットを1枚ずつ購入しようとしています。使用可能な紙幣は [50, 100, 200] の3種類です。 売り手は最初、手元にお金を一切持っていません(所持金0ルピー)。この状態で、並んでいる順番どおりにすべての人へチケットを販売できるかどうかを判定する必要があります。途中でお釣りを用意できなくなった場合、その時点で販売は失敗となります。 動作例 たとえば、入力が notes = [50, 50, 100, 100] の場合、答えは True になりま