東大理三生のプログラミング奮闘記

初心者プログラマーが半年間でどれだけ成長するか!についてのブログです。勉強方法とか使った本とかについて書いていくと思います!プログラミングをもっと身近に感じてもらえたら嬉しいです!毎日更新を目指します!

ARC #068 を python で解いてみた!

python の練習に、AtCoder #068を解きました〜
arc068.contest.atcoder.jp


少しコツがつかめて来たのか、問題が簡単だったのか分かりませんが、C, D, E 問題が解けました!
F問題は時間の都合(Djangoを勉強しないといけない...)でやめました。

解答を貼っていきます。
おかしいとか、もっとこうすればよくなるとかあれば、ぜひ教えてください!


問題 C
愚直にやるとかなり工数がかかったので、「出る目は6 or 5」と割り切ってやるとうまくいきました。
最初はどうしても愚直に全部パソコンにやらせるクセ?があります。

x = int(input())

set_num = int(x / 11)
remainder = x - set_num * x

if remainder == 0:
    print(set_num * 2)
elif 1 <= remainder <= 6:
    print(set_num * 2 + 1)
else:
    print(set_num * 2 + 2)


問題 D
最初、これも愚直にやらそうとしていましたが、「任意の3枚が全て異なる」のだと勘違いしていたことも相まって、「工数が半端ない and 実現できない」ことになり、しばらく詰まりました。
「任意の3枚が全部違っていい」ことに気づいてからはすっとできた気がします。勘違いって怖いですね...
あとは、関数の中に破壊的メソッドを使ったら、returnで返してもその関数を使った時に引数のオブジェクトが壊れることを知らず、最後の結果がうまくいかなかったので少し調べました。deepcopy()を使えばうまくいくのだとか(以下のリンクを参照しました)。
8.10. copy — Shallow and deep copy operations — Python 3.6.0 documentation

from copy import deepcopy

def remove_repeat(list1,list2):
    for n in list2:
        list1.remove(n)
    return list1

N = int(input())

card = [int(a) for a in input().split()]
card_copy = deepcopy(card)
card_no_repeat = list(set(card))
card_repeat = remove_repeat(card_copy, card_no_repeat)

repeat_num = len(card) - len(card_no_repeat)

if repeat_num == 0:
    print(len(card))
elif repeat_num % 2 == 1:
    print(len(card_no_repeat) - 1)
elif repeat_num % 2 == 0:
    if len(set(card_repeat)) == 2:
        if card_repeat[0] == card_repeat[1] + 1 or card_repeat[0] == card_repeat[1] - 1:
            print(len(card_no_repeat) - 2)
        else:
            print(len(card_no_repeat))
    else:
        print(len(card_no_repeat))


問題 E
これも少し最後調整しました。
「一番下のifの中にbreakを入れていなかったので、重複して数えていて答えがおかしくなっていたこと」と、「なぜが列車は駅をぐるぐる循環すると思っていたので、真ん中ぐらいの内包表記内の if i*m <= M を書いていなかったこと」の2点でした。

N, M = [int(n) for n in input().split()]

# お土産が買える範囲
souvenir_range = []
for i in range(N):
    l, r = [int(n) for n in input().split()]
    souvenir_range.append(list(range(l, r+1)))
print(souvenir_range)

# それぞれの電車が止まる駅の種類
stop_list_each_train = []
for i in range(1, M+1):
    stop_list_each_train.append(list(set([(i*m) % (M+1) for m in range(M+1) if i*m <= M])))
print(stop_list_each_train)

for stop_list in stop_list_each_train:
    counter = 0
    for souvenir in souvenir_range:
        for stop in stop_list:
            if stop in souvenir:
                counter += 1
                break
    print(counter)