AtCoderコンテスト参加記録:A〜C問題の解法と備忘録
本記事は、プログラミングコンテスト「AtCoder Beginner Contest 453 (ABC453)」に参加した際の、A、B、Cの各問題に対する復習と解答の備忘録である。記事では、コンテスト中に考えた解法の方針と、実際に提出したPythonコードが詳細に記述されている。
【A問題:Trimo】
問題は、長さNの文字列Sから、先頭に連続する'o'をすべて取り除いた文字列を出力することである。制約はNが1から50の整数、Sが英小文字からなる文字列である。筆者は、先頭から'o'でない文字が最初に出てくる場所を特定し、それ以降の文字列を出力するという方針を採用。コードでは、ポインタ変数iを使い、S[i]が'o'である限りインクリメントし、最終的にS[i:](i以降の文字列)を出力することで問題を解決している。
【B問題:Sensor Data Logging】
測定値が時刻0からTまで記録されるセンサーデータに関する問題である。時刻0では測定値を保存し、時刻1からTでは、「現時刻の測定値」と「直前に保存された測定値」との差の絶対値がX以上である場合に限り、値を保存する。制約はTが1から100、Xが1から100、測定値A_iが0から100である。筆者は、問題の規則通りにシミュレーションを行う方針を採用し、ループ処理を用いて、条件を満たした時刻と測定値を順次出力するコードを提出している。
【C問題:Sneaking Glances】
数直線上の座標0.5からスタートし、N回の移動を行う問題である。各移動で「正の方向」または「負の方向」のいずれかを選択し、対応する距離L_iだけ進む。目標は、座標0を最大で何回通り過ぎることができるかを最大化することである。制約はNが1から20、L_iが1から10^9である。筆者は、Nが最大20と小さいため、すべての選択肢を全探索($2^N$)する方法を採用。2進数表現を用いて全探索を行い、移動のたびに現在の座標が0を通過するかどうかを判定し、最大回数を求めるロジックを構築している。この備忘録は、各問題の具体的な解法プロセスを記録することで、今後の学習や対策に役立てることを目的としている。
背景
本記事は、プログラミングコンテスト(AtCoder)の特定の回(ABC453)に参加した際の、個別の問題に対する学習記録・備忘録である。プログラミングコンテストは、与えられた問題を効率的なアルゴリズムとコードで解く能力を試す場であり、参加者は解法や提出コードを記録し、知識を定着させる。
重要用語解説
- AtCoder: 日本のオンライン競技プログラミングプラットフォーム。競技プログラミングのコンテストが開催され、参加者がアルゴリズムやコーディングスキルを競い合う場。
- 全探索: 考えられるすべての組み合わせやパターンを網羅的に試す手法。Nが小さい場合に有効だが、Nが大きいと計算量が爆発するリスクがある。
- ポインタ変数: 配列や文字列の特定の要素の位置(インデックス)を指し示す変数。コード内で処理の開始点や終点を動的に管理するために使用される。
今後の影響
この種の記録は、単なる問題の解答に留まらず、異なる問題に対してどのようなアルゴリズム(例:文字列処理、シミュレーション、全探索)を適用できるかを体系的に整理する学習プロセスそのものに価値がある。今後のコンテスト対策において、解法パターンの定着に役立つ。