A - Three-Point Shot Editorial by dokin


プログラミング初心者を対象にA問題の解き方を解説します。ご意見などがあれば、dokinのtwitterまでご連絡ください。

注意
C++の利用を想定した解説です。 Pythonなど他言語を利用される方は、別の解説をご覧ください。

必要な知識

プログラミング言語C++の勉強には、AtCoder公式の学習教材 APG4b がおすすめです。

今回の問題では、以下の項目が参考になります。

また、APG4bには記載がありませんが、STLの関数 absを知っていると簡単に問題を解くことができます。

  • abs(a) : aの絶対値(absolute value)を返す。(例: abs(3) = 3, abs(-2) = 2, abs(0) = 0)

これらの知識について、正確に覚える必要はありません。 忘れてしまったときには自力で解決しようとせず、APG4bなどで調べなおす習慣をつけましょう。

考え方

問題文に書かれている条件を整理し、数式の形にします。

「得点状況 \(X\)\(Y\) から劣勢のチームが3 点入れると逆転が起こる」
\(\iff\)\(X\)\(Y\) の 差が3未満」
\(\iff\)\(\mathrm{abs}(X-Y)<3\)

したがって、

  • \(\mathrm{abs}(X-Y)<3\) ならば、Yes を出力する
  • そうでないならば、Noを出力する

コードを書きたいです。

実装

次のような順番で実装します。

  1. int型の変数 X,Y を宣言する。
  2. 入力からX,Yの値を受け取る。
  3. abs( X - Y) < 3 ならば、Yesを出力する。
  4. そうでないならば、Noを出力する。
#include<bits/stdc++.h>
using namespace std;

int main() {
        // int型の変数 X,Y を宣言する。  
	int X, Y;

        //入力からX,Yの値を受け取る。
	cin >> X >> Y;

	//abs(X-Y)<3であれば、Yesを出力する。 
	if (abs(X - Y) < 3) {
		cout << "Yes" << endl;
	}

	//そうでないならば、Noを出力する。
	else {   
		cout << "No" << endl;
	}
}

1-2行目
現時点では、この部分を「おまじない」だと思っていただいて問題ありません。 main関数の内側(5-19行目 )にコードを書いていきます。

5-6行目
(変数の型) (変数名1), (変数名2), … ;  により、変数を宣言できます。
変数の型とは、変数に書き込めるデータの種類のことです。 今回は整数を扱うので、int型の変数を宣言します。
変数名には、アルファベットであれば原則好きな名前をつけることができます。今回は問題文に合わせ、X,Yと名前をつけます。

8-9行目
cin >> (変数1) >> (変数2) >> … ; により、入力を受け取ります。今回は、X,Yの値を入力から順番に受け取ります。

11-14行目
条件式「abs(X - Y) < 3 」を満たすとき Yes を出力したいです。
if (条件式) { 処理 } により、条件式をみたすかどうかを判定し、満たした場合に処理を実行することができます。
また、cout << “文字列” ; と書くことで、文字列を出力することができます。 今回のコードでは、最後に endl を出力することで改行しています。

16-19行目
if文のあとにelse句を付け加えることで、条件式を満たさなかった場合の処理を書くことができます。 今回のコードでは、条件式「abs(X - Y) < 3 」を満たしていないとき、No を出力します。

不正解の時は…

  • 出力の間違い
    • “Yes”, “No”と出力すべきところを、”YES”, ”NO”と出力している。
       
  • 条件式の間違い
    • X - Y > -3 || X - Y < 3
    • abs(X - Y) <= 3
      など、間違えた条件式を書くとWAになります。
        
  • 複雑なコードを書いた結果、どこかにバグを埋め込んでいる。
    • 今回の問題では、問題文に書かれている通りに実装するとコードが複雑になってしまいます (提出例)。 紙の上で条件を整理し、シンプルなコードを書くように心がけると、バグを減らすことができます。

類題

  • if文による判定問題

  • abs関数を用いる問題

工事中

posted:
last update: