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

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

はじめに

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

過去問題ということで、実際にスキルチェックに挑戦する前に抑えておきたい問題集。

単語のカウント(Cランク)

リストの例

list1 = input().split()
list2 = []

for i in list1:
    if i not in list2:
        list2.append(i)

for j in list2:
    count1 = list1.count(j)
    print(j + " " + str(count1))

辞書の例

辞書はget()を使って存在の有無を確認する。

list1 = input().split()

dict1 = {}
for i in list1:
    if dict1.get(i) is None:
        dict1[i] = 1
    else:
        dict1[i] += 1

for i, j in dict1.items():
    print(i, j)

検索履歴 (Cランク)

最初の頃に書いた無駄に長いコード。

n = int(input())
list1 = []

for i in range(n):
    x = input()
    if x not in list1:
        list1.append(x)
    else:
        list1.remove(x)
        list1.append(x)

list1.reverse()
num2 = len(list1)

for i in range(num2):
    y = list1[i]
    print(y)

この記事を書く時に改めて考えて書いたコード。

n = int(input())
list1 = []
for i in range(n):
    tmp = input()
    if tmp in list1:
        list1.remove(tmp)
    list1.append(tmp)

for i in reversed(list1):
    print(i)
   

宝くじ (Cランク)

最初の頃に書いたコード。

# prizes
num1 = int(input())
pr1 = num1
pr1a = int(num1 + 1)
pr1b = int(num1 - 1)
pr2 = int(str(num1)[-4:])
pr3 = int(str(num1)[-3:])

# tickets
num2 = int(input())

for i in range(num2):
    x = int(input())
    x2 = int(str(x)[-4:])
    x3 = int(str(x)[-3:])
    if x == pr1:
        print('first')
    elif x == pr1a or x == pr1b:
        print('adjacent')
    elif x2 == pr2:
        print('second')
    elif x3 == pr3:
        print('third')
    else:
        print('blank')

今考えたコード。

def tickets():
    n2 = int(input())

    for i in range(n2):
        x = int(input())
        x2 = x % 10000
        x3 = x % 1000
        if x == prize1:
            print('first')
        elif x == prize1a or x == prize1b:
            print('adjacent')
        elif x2 == prize2:
            print('second')
        elif x3 == prize3:
            print('third')
        else:
            print('blank')


# prizes
n1 = int(input())
prize1 = n1
prize1a = n1 + 1
prize1b = n1 - 1
prize2 = n1 % 10000
prize3 = n1 % 1000

tickets()

野球の審判 (Cランク)

最初の頃に書いたコード。scountはストライクの数、bcountはボールの数をカウントする変数。

num1 = int(input())
scount = 0
bcount = 0

for i in range(num1):
    x = input()
    if x == 'strike':
        if scount == 2:
            print('out!')
        else:
            print('strike!')
            scount += 1
    else:
        if bcount == 3:
            print('fourball!')
        else:
            print('ball!')
            bcount += 1

今考えたdefの例。s_countとb_countをグローバル変数として扱う。

def function1():
    global s_count
    global b_count
    x = input()
    if x == 'strike':
        if s_count == 2:
            return 'out!'
        else:
            s_count += 1
            return 'strike!'
    else:
        if b_count == 3:
            return 'fourball!'
        else:
            b_count += 1
            return 'ball!'


num1 = int(input())
s_count = 0
b_count = 0

for i in range(num1):
    print(function1())

日別訪問者数の最大平均区間 (Bランク)

最初の頃に書いたコード。無駄が多いが、当時は答えを出せればそれで良かった。

line1 = input().rstrip().split(" ")
n1 = int(line1[0])
n2 = int(line1[1])
n3 = n1 - n2 + 1

line2 = input().rstrip().split(" ")

counter1 = 0  # temp counter
counter2 = 0  # temp max
c3_max = 0  # overall max
counter5 = 0  # equal num
counter6 = 0  # 1st max

for j in range(n3):
    counter1 = 0
    counter2 = c3_max
    for i in range(n2):
        counter1 += int(line2[i + j])

    if counter1 > counter2:
        c3_max = counter1
        counter2 = counter1
        counter6 = j + 1
        counter5 = 0
    if counter1 == counter2:
        counter5 += 1
    else:
        pass

print(str(counter5) + ' ' + str(counter6))

今考えたコード。多少気が利くようになった気がする。

n, k = map(int, input().split())
list1 = [int(_) for _ in input().split()]
list2 = []

for i in range(n - k + 1):
    tmp = 0
    for j in range(k):
        tmp += list1[i + j]
    list2.append(tmp)

max_num = max(list2)
print(list2.count(max_num), list2.index(max_num) + 1)

みんなでしりとり (Bランク)

最初の頃に書いた仮コード。printで選手の脱落をチェックして動作確認していた。途中のprintは答えを出すのに不要なので、提出時はコメントアウトか削除する。

[n, k, m] = [int(i) for i in input().split()]

player_lst = []

for i in range(n):
    player_lst.append(i+1)

words_lst = []

for i in range(k):
    words_lst.append(input())

x = input()
words_lst.remove(x)
p = 1
removed = 0

for i in range(m - 1):
    print('test_' + str(i))
    p += 1
    while player_lst.count(p) == 0:
        p += 1
        if p > n:
            p = 1

    print('player_' + str(p) + ' playing')

    if p > n:
        p = 1
    y = input()

    if y not in words_lst:
        player_lst.remove(p)
        print('player_' + str(p) + '_removed')
        removed = 1
    elif y[-1] == 'z':
        player_lst.remove(p)
        print('player_' + str(p) + '_removed')
        removed = 1
    elif (y[0] != x[-1]) and (removed == 0):
        player_lst.remove(p)
        print('player_' + str(p) + '_removed')
        removed = 1

    else:
        words_lst.remove(y)
        x = y
        removed = 0

print(len(player_lst))

for i in player_lst:
    print(i)

今書いてみたコード。多少無駄が減っている。多少長いが一つ一つの操作は難しくない。def文を使えばもう少しスッキリすると思う。

少し解説しておくと、p_countはプレイヤーのターンを管理する変数。player_nowは現在のプレイヤーをplayersから取り出している。

current_wordがword_listに入っていない場合、単語の最後がzの場合、前の単語(previous_word)の最後とcurrent_wordの頭が一致していない場合を判定し、それぞれプレイヤーを除外する処理をしている。

n, k, m = map(int, input().split())
players = [i for i in range(1, n + 1)]
words_list = [input() for _ in range(k)]

previous_word = None
p_count = -1
for i in range(m):
    # breakpoint()
    p_count += 1
    if p_count >= len(players):
        p_count -= len(players)
    player_now = players[p_count]

    current_word = input()
    if current_word not in words_list:
        players.remove(player_now)
        previous_word = None
        p_count -= 1
        continue
    elif current_word[-1] == 'z':
        players.remove(player_now)
        previous_word = None
        p_count -= 1
        continue
    elif previous_word:
        if previous_word[-1] is not current_word[0]:
            players.remove(player_now)
            previous_word = None
            p_count -= 1
            continue

    words_list.remove(current_word)
    previous_word = current_word

print(len(players))
for i in players:
    print(i)

神経衰弱 (Bランク)

昔書いたコードは「みんなでしりとり」と同じように無駄が多いものだった。今の頭でもう一度まっさらな状態から書いてみたところ5分程度でこのようなものが出来た。

cardsという二重リストでカードを管理している。問題文には「カードが取り除かれる」という記述があるが、コード上は除去する操作をしなくても正当にたどり着く。ゲームのルール上、存在しないカードを取ろうとすることはない。

h, w, n = map(int, input().split())
points = [0 for _ in range(n)]
cards = [[int(_) for _ in input().split()] for _ in range(h)]

m = int(input())
turn = 0
for i in range(m):
    a1, a2, b1, b2 = map(int, input().split())
    card1 = cards[a1 - 1][a2 - 1]
    card2 = cards[b1 - 1][b2 - 1]
    if card1 == card2 and card1 != '-':
        points[turn] += 2
        continue
    else:
        turn += 1
        if turn >= len(points):
            turn -= len(points)

for i in points:
    print(i)

pandasを使ってみた。処理速度は遅くなる。

import pandas as pd

h, w, n = map(int, input().split())
points = [0 for _ in range(n)]
cards = [[int(_) for _ in input().split()] for _ in range(h)]

sr = pd.Series(points)
df = pd.DataFrame(cards)

m = int(input())
turn = 0
for i in range(m):
    a1, a2, b1, b2 = map(int, input().split())
    card1 = df.iloc[a1 - 1][a2 - 1]
    card2 = df.iloc[b1 - 1][b2 - 1]
    if card1 == card2 and card1 != '-':
        sr[turn] += 2
        continue
    else:
        turn += 1
        if turn >= len(points):
            turn -= len(points)

for i in sr:
    print(i)

日別訪問者数の最大平均区間(large) (Aランク)

この問題は上の「 日別訪問者数の最大平均区間 」と殆ど同じだが、テストの量が異なるため、同じロジックでは時間切れになってしまう。累積和の最大値と最初に遭遇した位置を記録することで計算量を減らす工夫が必要になる。

昔書いたコード。少し無駄がある。

[x, y] = [int(i) for i in input().split()]
line2 = [int(i) for i in input().split()]

first_sum = sum(line2[0:y])
tmp_sum = first_sum
tmp_max = first_sum
counterA = 1
counterB = 1

for i in range(x - y + 1):
    if i == 0:
        continue

    tmp_sum = tmp_sum - line2[i - 1] + line2[y + i - 1]

    if tmp_max == tmp_sum:
        if counterA == 0:
            counterA = 2
        else:
            counterA += 1
    if tmp_max < tmp_sum:
        tmp_max = tmp_sum
        counterA = 1
        counterB = i + 1

if counterA == 0:
    counterA = 1

print(counterA, counterB)

今書いてみたコード。

tmp_maxは暫定的な最大値、tmp_sumは暫定的な合計値、max_posは最大値が最初に出現する位置、max_amountは最大値が出現する回数をそれぞれ扱う。

forループ内では、リスト内での合計値を測る位置を一つづつずらして処理していくわけだが、その中で前後の数値を足し引きすることで計算量を減らしている。この問題は別の箇所に出てくる累積和の解説を読むと良く分かるはずなので、初見の段階でイマイチ理解出来なくても気にしなくていい。

n, k = map(int, input().split())
list1 = [int(_) for _ in input().split()]
tmp_max = sum(list1[:k])
tmp_sum = tmp_max
max_pos = 1
max_amount = 1

for i in range(n - k + 1):
    if i == 0:
        continue

    tmp_sum = tmp_sum - list1[i - 1] + list1[k + i - 1]

    if tmp_max == tmp_sum:
        max_amount += 1

    if tmp_max < tmp_sum:
        tmp_max = tmp_sum
        max_amount = 1
        max_pos = i + 1

print(max_amount, max_pos)

コメント

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

Please disable your adblocker or whitelist this site!

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