Yukii

主にプログラミング(Flutter)についての記事を書いています。

AtCoderの過去問をDartで解いてみた~Part1~

本日は、@drkenさんの AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~ の第一問目をDartで解いてみました。
第一問では

  • 四則演算
  • 倍数判定

がキーポイントになっております。

ABC 086 A - Product (100 点)

[問題]
二つの正整数 a,bの積が偶数か奇数か判定してください。

[解法]

import 'dart:io';

void main() {
  List ab = stdin
      .readLineSync()
      .split(" ")
      .map((x) => int.parse(x))
      .toList(); // 一行に複数入力する方法
  int c = ab[0] * ab[1];
  if (c % 2 == 0) {
    // あまりで偶奇を判断する
    print("Even");
  } else {
    print("Odd");
  }
}

解法としては、標準入力した積の余りから偶奇を判断します。

ABC 064 A - RGB Cards

[問題]
赤、緑、青色のカードを持っています。
それぞれのカードには 1以上 9以下の整数が書かれています。
3つのカードを左から順に赤、緑、青色の順に並べ、左から整数を読んだときにこれが 4の倍数であるか判定しなさい。

[解法]

import 'dart:io';

void main() {
  List rgb = stdin.readLineSync().split(" ").map((x) => int.parse(x)).toList();
  int sum = rgb[0] * 100 + rgb[1] * 10 + rgb[2]; // カードの整数を各桁に設置する
  if (sum % 4 == 0) {
    print("YES");
  } else {
    print("NO");
  }
}

解法としては、カードの整数を各桁に設置して、4で割った余りから判断します。

ABC 088 A - Infinite Coins

[問題]
1円硬貨をA枚と500円硬貨を無限枚持っています。
これらの硬貨だけを使うことによって、ちょうどN円を支払うことができるかを判定しなさい。

[解法]

import 'dart:io';

void main() {
  int n = int.parse(stdin.readLineSync());
  int a = int.parse(stdin.readLineSync());

  int ans = n % 500;
  if (ans <= a) {
    print("Yes");
  } else
    print("No");
}

解法としては、持っている500円硬貨は無数個なので余りのみ考えれば良いことになります。

ABC 157 A - Duplex Printing

[問題]
全Nページから成る書類を両面印刷します。両面印刷では1枚の紙に2ページ分のデータを印刷することが出来ます。
最小で何枚の紙が必要か求めてください。

[解法]

import 'dart:io';

void main() {
  int n = int.parse(stdin.readLineSync());

  int ans0 = (n / 2).floor();
  int ans1 = n % 2;
  if (ans1 == 0) {
    print(ans0);
  } else
    print(ans0 + 1);// 余りが出たら1ページ足す
}

ceil()を使っても良かったかもしれません。

まとめ

業務ではFlutterを使っているので、このようなdartの扱いをしたことがなかったのでとても楽しかったです。
そもそも「標準入力って何?」からはじまりました。
しかし、以下の記事を参考に5日間勉強して楽しくコンテストを受けることができました。
残りの練習問題もボチボチ記事にしていきますのでよろしくおねがいいたします!

(参考)
qiita.com
qiita.com