AtCoder Beginner Contest 170を見直す(その2)
昨日はA問題、B問題を見直したので本日はC問題を見直したいと思います。
C - Forbidden List
問題
整数Xと整数列(P1, P2, P3....PN)が与えられるので、整数列に含まれない整数でもっとも整数Xに近い整数を出力せよ、ちなみに複数あった場合は数字が小さい方を出力すること。
制約
1<=X<=100
0<=N<=100
1<=P<=100
といった感じです。公式の解説動画では
制約より整数列に含まれる数字は1〜100なので、出力の範囲は0〜101であることがわかる(全てが整数列に含まれる場合でも0以下や、101以上が出力値になる事はない)。よって、出力範囲の全ての値で「整数列に含まれていないことを確認」し、含まれていない場合、Xとの絶対値と自分自身の値を比較し、最も近くて小さい値を出力するという方法で解答していました。私が作成した解答は以下の通りです。
作成した解答
X, N = map(int, input().split())
p_list = list(map(int, input().split()))
if N == 0: #①
print(X)
else:
for i in range(0,100):#②
if not X-i in p_list:#③
print(X-i)
break
elif not X+i in p_list:
print(X+i)
break
①Nが「0」の場合は「X」を出力というサンプルがあったのでそのまま記載しています。
②これ冷静に考えるとこんなに広くレンジ取る必要なかったですね。Xが50のときにそこから上下全部整数列に含まれるとしても「0」が解答なので「0,51」のレンジで良かった気がします。まぁ、どっちにしろ解答が出た時点でループ止まるのでどうでもいいんですが。
③「X-i」が整数列に含まれない場合はその値を出力します。含まれている場合は「X+i」を検証します。
といった感じで結構簡単に解けているように見えるんですが、実は最初に作った解答は以下のように結構ひどいものでした。
最初に作った酷い回答
import math
X, N = map(int, input().split())
p_list = list(map(int, input().split()))
ans = p_list[0]
def near_num(a, b):
global X
if abs(X-a) < abs(X-b):
return a
elif abs(X-a) > abs(X-b):
return b
else:
return a if a < b else b
for i in p_list[0:]:
ans = near_num(ans, i)
print(ans)
関数まで作って何やってんだろう?という感じなんですが。表に含まれる中で、最もXに近くて小さい値を出力してます。もちろんサンプル流してすぐに気付きましたが、当然ダメですね。
昨日の記事にも書きましたが、疲れてたんや。多分。
この記事が気に入ったらサポートをしてみませんか?