Open6

コーディングテスト対策日記(Pythonの使い方メモ)

ピン留めされたアイテム
青木大青木大

概要

  • コーディングテスト対策として、コーディングテストの傾向と対策を調べる。
  • 毎日paizaの問題を一問以上解く。
  • このスクラップは毎日その中で気づいたこと、覚えておきたいことをメモしていく。
青木大青木大

1日目

  • Cランク問題を解いた
  • 解答時間中央値よりは時間がかかったが徐々に慣れていきたい

メモ

入力で複数の値を取得する

a,b=input().split()

split関数は半角スペース、タブ、改行で文字列を分割することができる。

入力の行数が不明な場合:値を1行ずつ配列に入れる

import sys
a = []
for l in sys.stdin:
    a.append(int(l))

sysモジュール

  • Pythonの標準ライブラリ、Pythonのインタプリタと対話するための機能を提供

sys.stdin

  • 入力を読み取るために使う

append()

  • リスト(配列)に新しい要素を追加するためのメソッド
  • リストの最後に1つの要素を追加する

配列のループ処理

fruits = ['みかん', 'りんご', 'ぶどう']
for fruit in fruits:
    print(fruit)

出力:

みかん
りんご
ぶどう

気づいたこと

  • print関数で変数の値を適時確認していった方がコードの状況を理解しやすい。
    • 最終的な回答では確認のためのprint関数はコメントアウトしておく。
      → コーディングテストの際には、消しておいた方がいいのか、コメントアウトのままでいいのかは不明
  • if文で比較するときは型を合わせておく。
  • 変数の初期化は大事。
青木大青木大

2日目

  • Cランク問題を解いた
    • そろそろBやっていきたい
  • 結構時間がかかってしまった

メモ

入力値が整数の場合

n = int(input())

しっかりint型で変数に代入しておいた方が安心

入力:1行ずつ配列に入れる

入力

グー
チョキ
パー
グー
パー
パー

コード

rounds_list = [input() for i in range(n)]

Pythonの論理演算子

  • and
  • or
  • not
    →&&や||、!を書くとエラーになる

Pythonのインクリメント、デクリメント

x += 1
y -= 1
# x++,y--は使えない

変数名の付け方

  • 変数名にハイフンは使うことができない
  • なるべく英語で書きたい

複数単語の変数名

キャメルケース

tournamentName = "じゃんけん大会"

パスカルケース

TournamentName = "じゃんけん大会"

スネークケース

tournament_name = "じゃんけん大会"

個人的にはスネークケースが見やすい

気づいたこと

  • 解答時間について
    • 適当な変数名をつけて提出するよりは、変数名を適切に命名して、他人が読みやすいコードを書くことに時間を使うのは良いかもれない。
  • 結果の局所化
    • 依存関係にあるコードをできるだけ一つの箇所にまとめる。
  • 急がば回れ
    • 値の確認用の変数も定義していった方が解きやすい。
青木大青木大

3日目

  • Bランク問題に挑戦したが、結局解けなかった
    • あと一歩のところまでは行った気がする
  • その後、Cランク問題に挑戦
    • 解答時間中央値よりも初めて速く解くことができた。(成長を感じる)

メモ

任意の文字列の置き換え、削除:replace()

s = 'aokidai'

s = s.replace('ai', '')
print(s)
# 出力:aokid
  • 空文字列に置き換えすると削除される

正規表現を使って文字列を置き換え、削除:re.sub()

import re

s = 'aokidai'

# 正規表現を使って、母音(大文字・小文字)を一度に削除
s = re.sub(r'[aeiouAEIOU]', '', s)

print(s)
# 出力:kd

正規表現について

参照:https://www.megasoft.co.jp/mifes/seiki/meta.html

for文:range()

m = 10

# 0からmまで1ずつ増加
for i in range(0, int(m), 1):
    print(i)

プログラムの終了:sys.exit()

import sys

if m > n:
    print(m)
    sys.exit()

文字列の長さを取得:len()

s = 'aokidai'
print(len(s))
# 7

文字列の連結

m = 'aoki'
n = 'dai'

m += n
print(m)
# aokidai

文字列の部分一致

print('dai' in 'aokidai')
# True

文字列の中の特定の文字を抽出

s = 'aokidai'

print(s[0])
# a

気づいたこと

  • 冗長なコードを避ける。
    • 効率性の向上
    • 可読性の向上
    • メンテナンス性の向上
青木大青木大

4日目:9/28(土)

  • Cランク問題を解いた。
    • 解答時間中央値よりも2分オーバーしたが、通話しながら解いたので許容範囲

気づいたこと

  • 冗長なコードを書いてしまったので気をつける。
    • 提出後にChatGPTでリファクタリングしてもらい、最適な書き方を知る。

メモ

辞書形式を用いたreplace関数による文字列の置き換え

s = 'aokidai'

# 文字置換用の辞書
replace_map = {
    'a': '4',
    'o': '0',
    'k': '6',
    'i': '1',
}

# 辞書に基づいて文字を置換
for char, replacement in replace_map.items():
    s = s.replace(char, replacement)

print(s)
# 4061dai
  • replace_map.items() は辞書のキーとバリューを取り出す
    • charはキー(置き換えされる元の文字)
    • replacementはバリュー(置き換え後の文字)
青木大青木大

5日目:9/29(日)

  • cランク問題に挑戦したが、4/10しかテストケースが通らなくて失敗。

気づいたこと

  • 確認用のテストケースが通っていても、多めのデータを扱うテストケースだと通らないことがある。
  • 関数をちゃんと調べて、使える関数はしっかり使っていく。
    • for文を使った実装よりも、かなりコードを簡略化することができる。

メモ

配列の要素の合計

for文を使ったやり方

list_1 = [1,2,4,8]
total = 0

for n in list_1:
    total += n

print(total)
# 15 

sum()を使ったやり方

list_1 = [1,2,4,8]
total = sum(list_1)

print(total)
# 15

簡単に合計を求めることができる

エラーメッセージ list index out of range

  • リストに存在しない要素の値にアクセスしようとしていることが原因

入力で複数の値を取得し、int型に変換

n, l = map(int, input().split())

入力で複数の値をリスト形式で取得し、int型に変換

price_list = list(map(int, input().split()))

max()関数

  • 引数の値の中から最大値を返す

リストの最大値を取得

numbers = [10, 20, 30, 40]
max_value = max(numbers)
print(max_value)

# 40

key引数を用いて、特定の条件で最大値を取得

words = ["apple", "banana", "cherry"]
longest_word = max(words, key=len)  # 最も長い単語を取得
print(longest_word)

# banana

リスト内包表記

  • リストを効率的に生成するための簡潔な構文

構文

[for 要素 in イテラブル if 条件]
# イテラブル: 反復可能なオブジェクト(リスト、タプル、文字列など)

例:リスト内の要素を2倍にする

numbers = [1, 2, 3, 4, 5]
doubled_numbers = [x * 2 for x in numbers]
print(doubled_numbers)

# [2, 4, 6, 8, 10]

例:リストの中の偶数を抽出する条件付きリスト内包表記

numbers = [1, 2, 3, 4, 5]
even_numbers = [x for x in numbers if x % 2 == 0]
print(even_numbers)

# [2, 4]