スキルチェック見本問題セット | paizaラーニング Python解答例

paizaでPythonを学ぼう
スポンサーリンク

はじめに

この記事ではpaizaラーニングのレベルアップ問題集にあるスキルチェック見本問題セットのPython解答例を掲載する。解答例へのリンク一覧はpaizaでPythonを学ぼうに掲載。

このセットは問題傾向がバラバラな上に難度が急上昇する。どうやっても理解できない問題は無理せず後回しにするのが良いだろう。

掛け算(Dランク)

普通の書き方

a = int(input())
b = int(input())
print(a * b)

defを使った場合

def function1(a, b):
    return a + b


a = int(input())
b = int(input())
print(function1(a, b))

足し算 (Dランク)

mapの例

a, b = map(int, input().split())
print(a + b)

リスト内包表記の例

a, b = [int(_) for _ in input().split()]
print(a + b)

一番小さい値 (Dランク)

普通のfor

list1 = []
for i in range(5):
    list1.append(int(input()))

print(min(list1))

リスト内包表記

list1 = [int(input()) for _ in range(5)]
print(min(list1))

文字の一致 (Dランク)

普通のif文

a = input()
b = input()

if a == b:
    print('OK')
else:
    print('NG')

def文

def function1():
    a = input()
    b = input()
    if a == b:
        print('OK')
    else:
        print('NG')


function1()

Fizz Buzz (Cランク)

Fizz Buzzというのはプログラミングの世界では有名な問題らしい。こういうのを解いて面白いと感じられる人は自力で勝手にプログラミングを覚えられる気がする。

%は余りで//は整数の商を出力するのでセットで覚えると良い。

n = 1
m = int(input())

while n <= m:
    if n % 3 == 0 and n % 5 == 0:
        print("Fizz Buzz")
    elif n % 3 == 0:
        print("Fizz")
    elif n % 5 == 0:
        print("Buzz")
    else:
        print(n)

    n += 1

def文

def fizzbuzz():
    n = 1
    m = int(input())
    while n <= m:
        if n % 3 == 0 and n % 5 == 0:
            print("Fizz Buzz")
        elif n % 3 == 0:
            print("Fizz")
        elif n % 5 == 0:
            print("Buzz")
        else:
            print(n)

        n += 1


fizzbuzz()

長テーブルのうなぎ屋 (Bランク)

この辺りから少し難しくなってくる。私が最初に苦戦した問題だった。

辞書を使って解いた。checkerとcheck_seatで空席を確認しており、空席がなければchecker = 1となる。checker=0の場合だけtake_seatで着席させる。

def func1(dct1, m):

    for i in range(m):
        a, b = [int(_) for _ in input().split()]
        checker = 0
        for j in range(a):
            check_seat = j + b
            while check_seat > n:
                check_seat -= n
            if dct1[check_seat] == 1:
                checker = 1
                break

        if checker == 0:
            for j in range(a):
                take_seat = j + b
                while take_seat > n:
                    take_seat -= n
                dct1[take_seat] = 1

    return sum(dct1.values())


n, m = [int(_) for _ in input().split()]
dct1 = {}

for i in range(n):
    dct1[i + 1] = 0

print(func1(dct1, m))

pandasを使った解き方。実行速度は遅い。

import pandas as pd

n, m = [int(_) for _ in input().split()]
dct1 = {}

for i in range(n):
    dct1[i + 1] = 0

df1 = pd.DataFrame.from_dict(dct1, orient='index')

for i in range(m):
    a, b = [int(_) for _ in input().split()]
    checker = 0
    for j in range(a):
        check_seat = j + b
        while check_seat > n:
            check_seat -= n
        if df1.iat[check_seat - 1, 0] == 1:
            checker = 1
            break

    if checker == 0:
        for j in range(a):
            take_seat = j + b
            while take_seat > n:
                take_seat -= n
            df1.iat[take_seat - 1, 0] = 1

print(df1.iloc[:, 0].sum())

じゃんけんの手の出し方 (Aランク)

自分で考えても分からなかったので公式解説から方針を立てて書いてみた。この問題にはPythonの模範解答が載ってないのでご参考まで。

n, m = [int(_) for _ in input().split()]
s = input()

max_G_win = s.count('C')
max_C_win = s.count('P')
max_P_win = s.count('G')
max_win = 0
max_P = m // 5

for num_P in range(max_P + 1):
    for num_C in range(n - num_P + 1):
        counter = num_P * 5 + num_C * 2
        if counter == m:
            tmp_win = min(num_C, max_C_win) + min(num_P, max_P_win) + \
                      min((n - num_C - num_P), max_G_win)
            if tmp_win > max_win:
                max_win = tmp_win

print(max_win)

島探し (Sランク)

幅優先探索という単語すら知らない時にまろぶろぐさんの記事を参考にして解いた。0で外を埋めることで条件分岐を省略しているのがポイント。

def def1(x, y):
    lands = [[x, y]]
    while lands:
        x, y = lands.pop()
        g[y][x] = '0'
        if g[y + 1][x] == '1':
            lands.append([x, y + 1])
        if g[y - 1][x] == "1":
            lands.append([x, y - 1])
        if g[y][x + 1] == '1':
            lands.append([x + 1, y])
        if g[y][x - 1] == "1":
            lands.append([x - 1, y])


w, h = map(int, input().split())
g = [['0'] * (w + 2)]
for i in range(h):
    g.append(['0'] + input().split() + ['0'])
g.append(g[0])

count = 0
for i in range(1, h + 1):
    for j in range(1, w + 1):
        if g[i][j] == "1":
            count += 1
            def1(j, i)

print(count)

mod7占い (Sランク)

この問題では計算量を考える必要がある。一度「オーダー記法」で検索して、基本的な考え方を大まかに掴んだ方が良いかもしれない。

単純にゴリ押しで解こうと思うと、処理量が多いテストでも時間切れにならない効率的なコードを書く必要が出てくる。slideshareには吉岡氏が書いた本問の解説スライドがあり解放の方針が示されている。下のコードは解法2を参考にしたもの。

こんな考え方は自力で浮かんで来ないので、初心者のうちはさっさと答えを見て考え方を真似るのが良いと痛感した問題だった。

n = int(input())
lst1 = [int(input()) % 7 for _ in range(n)]
lst2 = [lst1.count(_) for _ in range(7)]

counter = 0

for i in range(7):
    for j in range(i, 7):
        for k in range(j, 7):
            if (i + j + k) % 7 == 0:

                c1 = lst2[i]
                c2 = lst2[j]
                c3 = lst2[k]
                if i == j:
                    c2 -= 1
                if j == k:
                    c3 -= 1
                if k == i:
                    c3 -= 1

                pat = c1 * c2 * c3
                if i == j == k:
                    pat /= 6
                elif i == j or j == k or k == i:
                    pat /= 2
                counter += pat

print(int(counter))

コメント

当ブログのコンテンツが気に入ったら広告ブロックの解除(ホワイトリスト化)をご検討下さい。

Please disable your adblocker or whitelist this site!

タイトルとURLをコピーしました