読者です 読者をやめる 読者になる 読者になる

数弱プログラマのいろいろ

数学が苦手なのにプログラムを書いている高専生のいろいろ

AtCoderで解いた問題について

はじめに

本日1/18(月)は、関東を中心に大雪に見舞われ、自分の通う学校は休校になりました。

Twitterを見ると休校に関して嬉しい嬉しくない等様々な反応がありましたがバイトをしているわけでもなく休日登校も特に苦じゃない僕にとっては3連休になっただけという感想です。

休校になるのは前日から予想できていたので夜更かしをして昼頃に起きました。
やることに迷っていたところで友達とAtCoderでプログラム練習をすることに。

この記事は今回学んだことについて書こうと思います。

やったこと

今回挑戦したのは過去問の【AtCoder Regular Contest 046】です。
arc046.contest.atcoder.jp

解いたのはAとBのみですが、数弱からすれば殺しにきているような問題でした。AtCoderにおいてWebでの検索は認められいるので、遠慮なく調べました。
以下が参考にしたサイトです。

AtCoder Regular Contest 046 A,B問題 感想

AtCoder Regular Contest 046 A,B問題 感想
kyuuko.s7.valueserver.jp

A問題

A問題はゾロ目数の問題でした。参考にしたサイトによると群数列を使うんだとか。

群数列ってなんでしょうね?
知らないですがA問題についてこのサイトに記されている解き方の主要部分をJavaで以下に記します。

Scanner usrInput = new Scanner(System.in);
int n = usrInput.nextInt();
int num = (n - 1) % 9 + 1; //繰り返す数字
int loop = (n - 1) / 9 + 1; //繰り返す回数
 
for(int i = 0;i < loop;i++){
	System.out.print(num);
}

ソースコード中のコメントにあるように、数式はそれぞれ

・繰り返す数字

・繰り返す回数

を表しています。

世の数学は謎です。どうしてそうなるのか追い求める気になりません。

根本から理解するのは難しいので、「ゾロ目数といえばこれ」という形で覚えておきます。

B問題

続くB問題は高橋くんと青木くんの石とりゲームです。

最初に石の数amountが与えられ、次にそれぞれが一度に取れる石の数a, bが与えられます。

どちらも最適な数石を取っていき、最後の石を取った方の勝ちというルールでどちらが勝つかを先に判断するプログラムを書くという問題です。

勝負する前に勝敗がわかるプログラムを書くとは、なんて残酷なんでしょう。自分はこういうゲーム苦手です。負けます。

参考にしたサイトによると、これまた法則があるんだとか。

書いてある内容を以下のソースコードに起こしました。

int amount = usrInput.nextInt();
int a = usrInput.nextInt();
int b = usrInput.nextInt();
 
if(a == b){
	if(amount % (a + 1) == 0){
		System.out.println("Aoki");
	}else System.out.println("Takahashi");
}else{
	if(a > amount){
		System.out.println("Takahashi");
	}else if(a != b){
		if(a > b){
			System.out.println("Takahashi");
		}else System.out.println("Aoki");
	}
}

書き方が悪いですね。if文条件はそれぞれひとつずつしか書いていないので読みにくいですがこういうことです。
出力は勝つ方の名前を吐いています。読みにくいという人は参考にしたサイト中に文章と条件で書いてあるのでそちらをご覧ください。

今回やったことは以上です。

さいごに

初記事からいきなりカンニングコーディングでしたが自分としてはかなり勉強になったつもりです。

プログラミングを勉強することにおいて数学は欠かせない知識というかなんというか、
何かを実装する上で浮かぶアルゴリズムの数を増やしてくれる、要はボキャブラリの部分にあたるものだと思うので、
数学に対する苦手等は克服したいと考えています。

ちなみにこのブログはGoogle Adsenseでの小遣い稼ぎみたいなところもあるので、広告についてはご了承ください。
安心してください、誘導等は規約違反なので行いません。
年齢違反だろ?と思った方、自分は兄と起業した会社名義(または兄名義で業務代理)でGoogle Adsenseアカウントを取りますのでご安心ください。

また自分の会社についてや、Google Adsense等に関しても記事が書ければなと思っています。
毎年、全国高専プログラミングコンテストに参加しているのでそれに関しても書こうと思っています。
よろしければまた読んでください。記事の更新が止まったら察してください。
それでは。