kitoketa blog

AWS/GCP、プログラミング、育成、リーダー、本の感想、などについて

AtCoder 勉強記録 ~茶色コーダーを目指して~ [ABC 157-C]

初めに

こんにちは。
去年からAtCoder競技プログラミングを始めており、これまでは毎週のコンテストに参加するだけだったのですが、最近、茶色コーダーを目指したいと思い、力を入れて過去問を解いていきます。言語はpython3です。
基本的にはABCのC問題を中心に解いていこうと思っています。
今のレートは196です。(2020/5/1 現在)。目指せ今年中に茶色コーダー!!

今回の問題

AtCoder Beginner Contest 157 C - Guess The Number
atcoder.jp

私の解答

https://atcoder.jp/contests/abc157/submissions/12546787

n, m = map(int, input().split())
sc = [list(map(int, input().split())) for _ in range(m)]

for i in range(1000): //0~1000までの整数をチェックする
    ans = str(i) //チェックしやすいように文字列に変換
    if len(ans) != n:
        continue
    for s, c in sc:
        if int(ans[s-1]) != c: //条件に合わなかったら次の整数のチェックへ
            break
    else:
        print(ans)
        exit()

print(-1)

解説

まず、考え方のポイントですが、答えは最大3桁の整数なので、それらすべての整数をループで回して条件に合うか調べます。
競プロになれてないと、そもそもそこに気が付かずにいろいろ考えちゃって沼にはまってしまうと思います。私もそうでした。。そこら辺の勘所は慣れが必要だと思います。
また、チェック時に整数を文字列に変換しておくと、チェックしやすいです。

◆入力が下記の場合

3 3
1 7
3 2
1 7
  1. n=3なので、100から999までをチェック
  2. 左から1桁目が7、3桁目が2、1桁目が7に合致したら出力

◆入力が下記の場合

3 2
2 1
2 3
  1. 左から2桁目が、1かつ3の整数はありえないので-1を出力