パンナの学生生活

地方大学の大学生/プログラミング言語【python】を中心に紹介しています。/日々の脳内をアウトプット/麻雀とワインと日本酒が好き/将来は幸せになりたい

pythonで戦うAtCoder競技プログラミング

今回はAtcoderpythonを使用するときに、便利な考え方があるので共有したいと思います。(初心者向け)

  1.   AtCoderとは、
  2.   どんな問題があるの?
  3.   結構使えるappend()について
  4.   appendと同じ機能のモジュールについて

   1.AtCoderとは

AtCoderとは、オンラインで参加できるプログラミングコンテスト競技プログラミング)のサイトです。

https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=2ahUKEwjpmuvB-dHkAhUlK6YKHUuAAp8QFjAAegQIABAB&url=https%3A%2F%2Fatcoder.jp%2F%3Flang%3Dja&usg=AOvVaw3X9-d3kTisT18ube_RPiGO

よく競プロ呼ばれたりしています。コンテストは大体土日の週末に開催されコンテストに出場するとレートが決まって色分けされます。色は黒・灰・茶・緑・水・青・黄・橙・赤となっています。赤が一番上で上位0.3%くらいだったかな、、、、

このくらいいくと大手企業からスカウトとか来るのかな、、、、????

ここのレベルまで達したら報告しますね。

   2.どんな問題があるのか

今回はBeginner contestについて話します。

問題構成としては、A,B,C,DまたはA,B,C,D,E問題に分かれています。

A問題は基本的な四則演算ができれば大丈夫なレベルです。

B問題はfor文やif文や配列の知識があれば大丈夫だと思います。

C問題からは少しレベルが違うように個人的には思いますね。

また、Atcoderの問題は入力形式が少し独特なので事前に調べておくといいと思います。覚えれば大体同じような入力形式なので。。

atcoder.jp

このような問題がB問題です。この問題を例題にpythonのappendを説明します。

   3.結構使えるappend()について

僕はこのB問題をこのように解答しました。

N = int(input())
V=list(map(int,input().split()))
C= list(map(int,input().split()))
a=[]
for i in range(0,N):
  if V[i]>=C[i]:
    a.append(V[i]-C[i])
  else:
    continue
print(sum(a))

この問題文を読むと難しく感じる人もいると思いますが、根本の問題としては配列Vと配列Cの差が正の場合それの合計を出力するプログラムを書け!!ということなんですね!

Atcoderは問題の本質を理解することが一番大切だと思います。

 ここでappendについて説明したいと思います。

 配列.append(要素)というように書き,リストに括弧内の要素を追加することができるのです。これが意外と使える。

B問題の場合各配列のV-Cが正なら配列aに計算結果を挿入しています。最後にsum()を使えば終了です。

   4.append()と同じようなモジュール

heapqは知っていますか?これはappend()と同じこともできます。また、heapqは様々な場面で使えるのでこれも覚えておくとatcoder以外でも使えるでしょう。ここにheapqが詳しく書いてあるので見てみてください。

https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=2ahUKEwjKzNrIh9LkAhXIyIsBHRUHADAQFjAAegQIAxAB&url=https%3A%2F%2Fdocs.python.org%2Fja%2F3%2Flibrary%2Fheapq.html&usg=AOvVaw3kKlXzloivUBWc01GJ1aFA

下にheapqを使用した場合のコードを載せました。実行時間は、heapqをモジュールしたほうが172 msでappend()を使用したほうが189 msでheapqをモジュールしたほうが早いことが分かりました。理由はわからん!!

ぜひ自分でもやってみてください。

import heapq
N = int(input()) 
V=list(map(int,input().split())) 
C= list(map(int,input().split())) 
a=[] 
for i in range(0,N): 
  if V[i]>=C[i]:
    heapq.heappush(a,(V[i]-C[i])) 
  else:
    continue 
print(sum(a))