-
Notifications
You must be signed in to change notification settings - Fork 0
/
レベルアップ問題集Python3 スキルチェック見本問題セット
178 lines (151 loc) · 4.75 KB
/
レベルアップ問題集Python3 スキルチェック見本問題セット
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
# 掛け算
m = int(input())
n = int(input())
print(m*n)
# 足し算
a,b = map(int, input().split())
print(a+b)
# 一番小さい値
n = [int(input()) for _ in range(5)]
print(min(n))
# 文字の一致
s = input()
t = input()
if s == t:
print("OK")
else:
print("NG")
# Fizz Buzz
n = int(input())
for x in range(1,n+1):
if x%15 == 0:
print("Fizz Buzz")
elif x%3 == 0:
print("Fizz")
elif x%5 == 0:
print("Buzz")
else:
print(x)
# 長テーブルのうなぎ屋
n,m = map[int, input().split()]
vacant = [True] * n # 空席状態 Trueで空席
for _ in range(m):
a,b = map(int, input().split())
# 座席番号bから連続してa人の客が座ることができるかを確認して 可能な場合はvacantを更新
can_sit = True
for i in range(b, b+a):
if not vacant(i%n):
can_sit = False
break
if not can_sit:
continue
for i in range(b, b+a):
vacant[i%n] = False
ans = 0
for v in vacant:
if not v:
ans += 1
print(ans)
# じゃんけんの手の出し方
n,m = map(int, input().split())
s = input()
enemy_g, enemy_c, enemy_p = 0,0,0
for v in s:
if v == "G":
enemy_g += 1
elif v == "C":
enemy_c += 1
else:
enemy_p += 1
ans = 0
for p in range(m//5 + 1):
c = (m - p*5) //2
g = n - p - c
if g < 0:
continue
if p*5 + c*2 != m:
continue
ans = max(ans, min(p,enemy_g) + min(c, enemy_p) + min(g, enemy_c))
print(ans)
# 島探し
# utf-8
'''
黒マスを起点とした幅優先探索を行えばよいです。
マスが探索済みかどうかを管理する変数を用意するか、
探索済みのマスを適宜白マスに書き換えることによって、同じ島を複数回探索しないように工夫する必要があります。
'''
m, n = map(int, input().split())
atlas = [input().split() for _ in range(n)]
move = [[-1, 0], [0, 1], [1, 0], [0, -1]]
ans = 0
for i in range(len(atlas)):
for j in range(len(atlas[i])):
if atlas[i][j] == "0":
continue
ans += 1
q = [(i, j)]
while q:
y, x = q.pop(0)
atlas[y][x] = "0"
for vec in move:
next_y = y + vec[0]
next_x = x + vec[1]
if not (0 <= next_y <= n - 1 and 0 <= next_x <= m - 1):
continue
if atlas[next_y][next_x] == "0":
continue
q.append((next_y, next_x))
print(ans)
'''
リストをキューのように扱うことで幅優先探索をしています。
Python のリストは要素を append メソッドで追加していくとき、
list.pop() のように使うとスタックの役割を、
list.pop(0) のように使うとキューを役割を果たすことができます。
'''
# mod7占い
'''
カードを 7 で割った余りで分類します。
各要素が 0 ~ 6 からなる 3 つ組 (a, b, c) であって、足すと和が 7 で割り切れるようなものを求めます。
それぞれの 3 つ組に対して、7 で割った余りが (a, b, c) となるようにカードを 3 枚選ぶ方法が何通りあるかを求めます。
それらを足し合わせたものが答えです。
入力が符号付き 32bit 整数型に収まらない場合があるので、注意しましょう。
'''
# utf-8
n = int(input())
a = [0] * 7
for _ in range(n):
a[int(input()) % 7] += 1
mod7 = []
for i in range(7):
for j in range(i, 7):
for k in range(j, 7):
if (i + j + k) % 7 == 0:
mod7.append((i, j, k))
ans = 0
for group in mod7:
i, j, k = group
if i == j == k:
ans += a[i] * (a[i] - 1) * (a[i] - 2) // 6
elif i == j:
ans += a[i] * (a[i] - 1) * a[k] // 2
elif j == k:
ans += a[i] * a[j] * (a[j] - 1) // 2
elif k == i:
ans += (a[k] - 1) * a[j] * a[k] // 2
else:
ans += a[i] * a[j] * a[k]
print(ans)
'''
方針に沿って実装しています。
(a, b, c) の組において
3 つの数値が同じ数の場合、
2 つの数値が同じ数の場合
は慎重に処理する必要があります。
【 3 つの数値が同じ数の場合 】
X 個の中から 3 つ選んで組み合わせを作るので、XC3 が求める組み合わせの数です。
捕捉 : XC3 = X * (X - 1) * (X - 2) / (3 * 2 * 1)
【 2 つの数値が同じ数の場合 】
X 個の中から 1 個選んで(組み合わせを作り)、同時に Y 個の中から 2 個選んで組み合わせを作るので、XC1 * YC2 が求める組み合わせの数です。
捕捉 : XC1 * YC2 = X * Y * (Y - 1) / (2 * 1)
式中にでてくる C は組み合わせの総数を求めるときに使われる数学の記号です。
'''