はるのぶろぐ。

情報系大学生ハルが、ゆるゆるとIT関係についてや日々の雑記を綴ります。ちょっとだけ、あなたの役に立てる、そんなブログを目指しています。

【AtCoder】超初心者のためのAtCoder Beginner Contest 240A問題の解説【C言語】【ABC240】

参加してます!ポチッとお願いします

記事名と
URLをコピー

こんにちは、情報系大学生のハル(Blog_IT_haru)です。

今回は、C言語でのAtCoder Beginner Contest 240(ABC240)に参加したので、自分の復習を兼ねてまとめていきたいと思います。

なお、私は灰色coderで、まださほど参加したことがありません。

超初心者ですので、備忘録的にまとめていきます。

f:id:Blog_IT:20220226120903p:plain

問題

A問題

下の画像で示す図において、a 番の点と b 番の点が線で直接結ばれているかを答える。

a,bが入力として与えられ、YesかNoを出力する。

制約:1≤a<b≤10で、a,b は整数。

問題ページ:A - Edge Checker

正解率

以下の正解率となっています。

とても高い正解率なので、簡単な問題だったことが伺えます。

灰コーダー正解率:97.9 %
茶コーダー正解率:99.0 %
緑コーダー正解率:97.8 %

引用:【AtCoder解説】PythonでABC240のA,B,C,D,E問題を制する! - Qiita

私の考え方

単純に、2から9のときは、1足したものと、1引いたものであるかを比べる。

10と1のときのみ少し特殊になるので、場合分けをした。

私のソースコード

#include <stdio.h>
int main(void){
    int a,b;
    scanf("%d %d",&a,&b);
    if(a==1){
        if(a+1==b||a+9==b){
            printf("Yes\n");
        }
        else{
            printf("No\n");
        }
    }
    else if(a==10){
        if(a-1==b || a-9==b){
            printf("Yes\n");
        }
        else{
            printf("No\n");
        }
    }
    else{
        if(a-1==b||a+1==b){
            printf("Yes\n");
        }
        else{
            printf("No\n");
        }
    }
}

公式の解説・考え方

問題の条件を達成することは、b−a=1 または b−a=9 が成り立つことと同値なので、それをプログラムに落とし込みます。

これは、私の考え方とほぼ同様です。

ただ、公式のコードの方がスマートですね笑

以下の公式ページに書いてあった、C++のコードを、C言語ver.にしました。

Editorial - AtCoder Beginner Contest 240

公式の考え方のコード

#include <stdio.h>
int main(void)
{
  int a, b;
  scanf("%d%d",&a,&b);
  if(b-a == 1 || b-a == 9) printf("Yes\n");
  else printf("No\n");
  
  return 0;
}

必要な知識

以下の知識が必要です。

※各項目をクリックすることで、該当の部分に飛べます。

scanfでの値の読み取る方法

if文の使い方

printfの使い方

scanfで値を読み取る方法

今回は、整数なので、以下の様に読み取ります。

    int a;
scanf("%d",&a);

intは、型の種類の一つで、整数を取り扱います。

簡単に言うと、大きさが大きくない整数を取り扱える型です。

int型を、scanfで読み取るときの変換指定子は、dです。

変換指定子を簡単に言うと、整数を読み取るためのものです。

scanf自体は、scanf(”書式文字列”, &変数名1, &変数名2…)というふうに使用します。

書式文字列の中に、%dなどの変換指定子を書きます。

使い方は以下のような感じです。

int a;
scanf("%d",&a);

if文の使い方

過去に、if文について書いていた記事がありましたので、一部引用しました。

ifという文字通り、「~なら~する」という、条件で処理を実行するか否か決めることができます。

次のように使います。

if (条件式) 処理 ;

または、

if(条件式){
  処理;
}

です。

(引用元:C言語で最大値を求める - ハルの初心者プログラミング部

ただ、私の考え方で解く場合はelse ifの知識も必要です。

以下のように使用します。

ifは最初の1つだけ、elseも最後の1つだけですが、else ifは何回でも使用することができます。

    if(条件式){
        /*実行すること*/
    }
    else if(条件式){
        /*実行すること*/
    }
    else{
        /*実行すること*/
    }

printfの使い方

過去に、printfについて書いていた記事がありましたので、一部引用しました。

printfは、文字列を表示するための関数です。

普通の文字列の場合

printf("tameshi");
\n

printf内で使います。

改行を行います。

先程の変換指定子の前か後に記入します。

前に記入した場合は前が改行され、後ろに記入した場合は後ろが改行されます。

今回も、見やすく出力するために、使用しました。

printf("\n%d",sum);

こんな感じですね。

(引用元:C言語で合計値を求める - ハルの初心者プログラミング部

おすすめな記事

ABC238の、A,B,C問題の解説の記事もありますので、ぜひ読んでみてください。

ABC239も書いてます。

blog-it.hatenablog.com

blog-it.hatenablog.com

blog-it.hatenablog.com

まとめ

いかがでしたか?

今回のA問題は、超がつくほど簡単でしたね。

\ほんとの初心者の方は、本で学ぶのもおすすめ!/

以下の記事でおすすめ本紹介しています!

blog-it.hatenablog.com

この記事がいいな、と思ってくれたら、SNSなどで拡散したり、

ブックマークやコメントなどしてくれると励みになります!

下の方とサイドバーにある、サポートもお待ちしています!

更に、読者になってくれたら、お返しに私も読者になります!

また、この記事の内容についてなにかありましたら、

お問い合わせ、コメント、TwitterのDMなどによろしくお願いします。

それでは。