見出し画像

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に近くて小さい値を出力してます。もちろんサンプル流してすぐに気付きましたが、当然ダメですね。

昨日の記事にも書きましたが、疲れてたんや。多分。

この記事が気に入ったらサポートをしてみませんか?