LoginSignup
0
0

More than 1 year has passed since last update.

ABC213 C - Reorder Cards が解けて歓喜

Posted at

abc213_1.png
abc213_2.png
abc213_3.png
abc213_4.png

眺めてて思ったが、行列とか関係なくね?
それぞれの要素(A1,B1...An,Bn)を小さい順に 1,2,3...N とナンバリングしなおせって問題では?
あとはデータの形式が [A1,B1],[A2,B2],[A3,B3]... になってるから行列のようにも見えるが
冒頭のイメージがあれば [A1,B1] とかはタダのデータ構造でしかない。。

ReorderCards_r0.py
H,W,N = map(int,input().split())
h = []
w = []
for _ in range(N):
    a,b = map(int,input().split())
    h.append(a)
    w.append(b)

h_ = sorted(h)#小さい順に並べ替え
w_ = sorted(w)#同上

#以下、辞書で小さい順に格納した key に i+1 と値を埋め込む
dich={}
dicw={}
for i in range(N):
    dich[h_[i]] = i+1
    dicw[w_[i]] = i+1

#冒頭の h, w を一個ずつ辞書に代入して前述の i+1 の順番を取り出した
for a,b in zip(h,w):
    print("{} {}".format(dich[a],dicw[b]))

しかし、見事に WA。
例えば、 [1,2] , [1,3] が与えられたとする。
冒頭の記述だと、

[1,2][1,1]
[1,3][2,2]

と認識してしまう。
望ましいのは

[1,2][1,1]
[1,3][1,2]

だ。また、for 文で回す場合は、一個飛ばした場合は、
次の数値が飛ばした値になるから、飛ばした分だけ詰めなければならない。

ReorderCards_r1.py
H,W,N = map(int,input().split())
h = []
w = []
for _ in range(N):
    a,b = map(int,input().split())
    h.append(a)
    w.append(b)

h_ = sorted(h)
w_ = sorted(w)

dich={}
cnth=0#行の重複をカウント
dicw={}
cntw=0#列の重複をカウント
for i in range(N):
    if h_[i] not in dich:
        dich[h_[i]] = i+1-cnth # 飛ばした分を詰めて辞書に記録
    else:
        cnth += 1              # 飛ばした回数をカウント

    if w_[i] not in dicw:
        dicw[w_[i]] = i+1-cntw # 飛ばした分を詰めて辞書に記録
    else:
        cntw += 1              # 飛ばした回数をカウント

for a,b in zip(h,w):
    print("{} {}".format(dich[a],dicw[b]))

うん! 説明下手,俺。

解けなかった問題が解けるようになった喜びは半端ない。。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0