TPTブログ

テックポート株式会社のブログです。 技術情報や製品・サービス情報、 また未経験社員がデータサイエンティストを 目指す奮闘記など、更新していきます。

AtCoderに挑戦

f:id:tbtech:20210611155255p:plain
こんにちは!
今回はシリーズとしてAtCoderに挑戦していきたいと思います!!

AtCoderとは?

atcoder.jp

AtCoderは、世界最高峰の競技プログラミングサイトです。
リアルタイムのオンラインコンテストで競い合うことや、
3,000以上の過去問にいつでもチャレンジすることができます

プログラミングも競技になる時代ですね~
競技プログラミングコンテストが定期的に開催され、
それに参加するとランクが上がっていくそうです٩( ´◡` )( ´◡` )۶

AtCoderランク

AtCoderのサイトからランクについて参照しました。

f:id:tbtech:20210611110043p:plainf:id:tbtech:20210611110114p:plain
これを見るとかなりハイレベルな競技が予想されますね(;゚д゚)ゴクリ…
赤のSSSランク、通称レッドコーダー(かっこいい(*∩ω∩))に到達するには一体どんな鍛錬を積むのでしょうか...
私はそんなレベル絶対無理なので、水色ランクを目指して頑張ります!!
それさえも絶対大変だろうけど(;´Д`)

AtCoder Beginners Selection

AtCoderに登録したらまずはこのAtCoder Beginners Selectionから始めます。
https://atcoder.jp/contests/abs
初心者向けに過去問から精鋭の11問が選ばれています!

PracticeA - Welcome to AtCoder

問題文
高橋君はデータの加工が行いたいです。
整数 a,b,cと、文字列 s が与えられます。 a+b+c の計算結果と、文字列 s を並べて表示しなさい。

a = int(input())
b,c = map(int, input().split())
s = input()
print("{} {}".format(a+b+c,s))

まずは入力値を受け取ります。数値はint型を指定して、文字列はそのままstr型になります。
受け取った入力値をformatを使ってprintすれば終了です。

ABC086A - Product

問題文
シカのAtCoDeerくんは二つの正整数 a,b を見つけました。a と b の積が偶数か奇数か判定してください。

a,b = map(int, input().split())
if a*b % 2 == 0:
  print('Even')
else:
  print('Odd')

入力値をifで奇数と偶数に振り分けます。
a*b%2はa*bが2で割ったときの余りを表します。
その余りが0(2で割り切れる)ならばEven(偶数)と出力し、
そうでないならOdd(奇数)と出力します。

ABC081A - Placing Marbles

問題文
すぬけ君は 1,2,3 の番号がついた 3 つのマスからなるマス目を持っています。
各マスには 0 か 1 が書かれており、マス i には siが書かれています。
すぬけ君は 1 が書かれたマスにビー玉を置きます。 ビー玉が置かれるマスがいくつあるか求めてください。

s = input()
print(s.count("1"))

入力値の1か0が3つ並んだ数値を文字列として受け取り、その中から1がいくつあるか数えるとビー玉の数が求まります。

ABC081B - Shift only

問題文
黒板に N 個の正の整数 A1,...,AN が書かれています.
すぬけ君は,黒板に書かれている整数がすべて偶数であるとき,次の操作を行うことができます.
黒板に書かれている整数すべてを,2 で割ったものに置き換える.
すぬけ君は最大で何回操作を行うことができるかを求めてください.

num = int(input())
array = list(map(int, input().split()))
count = 0
while all(x % 2 == 0 for x in array):
    array = [x/2 for x in array]
    count += 1
print(count)

N個を変数nに、正の整数 A1,...,ANをarrayというリストに入れます。
countという変数を初期値0にしておきます。
arrayから順にxに入れて2で割り切れることが全て確認できたら
whileの中へ入り、xを2で割った数をarrayに入れ直します。
そしてcountを+1します。
array内の数が1つでも2で割り切れなくなるとwhileは修了し、countを出力します。

ABC087B - Coins

問題文
あなたは、500 円玉を A枚、100 円玉を B 枚、50 円玉を C 枚持っています。
これらの硬貨の中から何枚かを選び、合計金額をちょうど X 円にする方法は何通りありますか。
同じ種類の硬貨どうしは区別できません。2 通りの硬貨の選び方は、ある種類の硬貨について
その硬貨を選ぶ枚数が異なるとき区別されます。

a,b,c,x = map(int,open(0))
print(sum(500*i+100*j+50*k == x for i in range(a+1) for j in range(b+1) for k in range(c+1)))

各入力値を変数に入れます。
各硬貨の枚数をi,j,kに順に入れてすべての組み合わせの合計値がxになったら、
その場合の合計回数を出力します。
今回は内包表記でスッキリまとまりました。

残り6問は次回へつづく(σゝ∀・)σ☆