[BOJ/Python]17140号2次元配列と演算



この問題は,当時の行と列の長さを計算することによって与えられたRとC演算を実現する問題である.まずdefaultdictを用いて行または列の数の出現を計算し、defaultdictを巡回してkeyおよびvalueをtupflo一時リストに格納し、lambdaを用いてこれらの一時リストをx[1]、x[0]の優先度で昇順に並べ替える.次に、一時リストを巡回し、結果リストにtupleのUnpacking値を入れ、行または列が整列した行または列を生成します.このプロセスはリスト全体で順番に行われます.このとき最大長さを求め、最大長さより小さい0をリストに埋め、0を埋めた後、長さが100より大きい場合は100に切り取る.
インデックスエラーが発生し続けます.これは、a[r][c]をチェックしたときに、行、列の長さがr、cより小さいときに発生します.歯を探すのにずいぶん時間がかかった.この部分は、検査前に、a[r][c]を検査し、解決するために、行および列の長さがr、cより大きい場合にのみ検査する.
  • r,c,kと入力します.
  • aリストを入力します.
  • r,cはそれぞれ1を減らした.
  • の結果を保存した変数の答えを0と宣言します.
  • cul r関数を宣言します.
    ->lstをリストとして宣言します.
    ->aの長さが繰り返されるiのfor文.
    -->dはdefaultdict(int)と発表された.
    -->a[0]の長さはjのfor文を繰り返す.
    -->a[i][j]が0の場合、続行します.
    -->d[a[i][j]]増加1.
    -->結果をリストにします.
    -->d巡回のkey,valueのfor文.
    ----->結果に(key, value)を加えます.
    -->key=lambda x: (x[1], x[0])を使用して結果をソートします.
    -->テンポラリリストtmpを宣言します.
    -->結果を返すx,yのfor文.
    ----->tmpに[x, y]を貼り付けます.
    -->lstにtmpを入れます.
    ->最大長を格納する変数mxlが0であることを宣言します.
    ->lstの長さが繰り返されるiのfor文.
    -->mx lをmx lおよびlen(lst[i])より大きい値に更新します.
    ->lstの長さが繰り返されるiのfor文.
    -->lst[i]プラスmx_l-len(lst[i])[0].
    -->len(lst[i])が100より大きい場合、
    -->lst[i]lst[i][:100]に更新されました.
    ->lstを返します.
  • cul c関数を宣言します.
    ->lstをリストとして宣言します.
    ->aの長さが繰り返されるiのfor文.
    -->dはdefaultdict(int)と発表された.
    -->a[0]の長さはjのfor文を繰り返す.
    -->a[i][j]が0の場合、続行します.
    -->d[a[i][j]]増加1.
    -->結果をリストにします.
    -->d巡回のkey,valueのfor文.
    ----->結果に(key, value)を加えます.
    -->key=lambda x: (x[1], x[0])を使用して結果をソートします.
    -->テンポラリリストtmpを宣言します.
    -->結果を返すx,yのfor文.
    ----->tmpに[x, y]を貼り付けます.
    -->lstにtmpを入れます.
    ->最大長を格納する変数mxlが0であることを宣言します.
    ->lstの長さが繰り返されるiのfor文.
    -->mx lをmx lおよびlen(lst[i])より大きい値に更新します.
    ->lstの長さが繰り返されるiのfor文.
    -->lst[i]プラスmx_l-len(lst[i])[0].
    -->len(lst[i])が100より大きい場合、
    -->lst[i]lst[i][:100]に更新されました.
    ->r lstは(len(lst[0])*len(lst))サイズが0のリストです.
    ->lstの長さが繰り返されるiのfor文.
    -->lst[0]の長さはjのfor文を繰り返す.
    -->r_lst[j][i]lst[i][j]に更新されました.
    ->r lstが戻ります.
  • を繰り返しながらドアを回します.
    ->len(a)がrより大きく、len(a[0])がcより大きい場合、
    -->a[r][c]がkの場合、
    ----->while文を閉じます.
    ->答えが100より大きい場合は、
    -->答えを-1に更新します.
    -->while文を閉じます.
    ->len(a)len(a[0])以上の場合、
    -->aはcul_r()の戻り値に更新されます.
    ->その他の場合、
    -->aはcul_c()の戻り値に更新されます.
    ->答えを1つ増やします.
  • の回答を印刷します.
  • Code

    from collections import defaultdict
    r, c, k=map(int, input().split())
    a=[list(map(int, input().split())) for _ in range(3)]
    r, c=r-1, c-1
    answer=0
    def cul_r():
        lst=[]
        for i in range(len(a)):
            d = defaultdict(int)
            for j in range(len(a[0])):
                if a[i][j]==0:
                    continue
                d[a[i][j]]+=1
            result=[]
            for key, value in d.items():
                result.append((key, value))
            result.sort(key=lambda x: (x[1], x[0]))
            tmp=[]
            for x, y in result:
                tmp+=[x, y]
            lst.append(tmp)
        mx_l=0
        for i in range(len(lst)):
            mx_l=max(mx_l, len(lst[i]))
        for i in range(len(lst)):
            lst[i]+=[0]*(mx_l-len(lst[i]))
            if len(lst[i])>100:
                lst[i]=lst[i][:100]
        return lst
    def cul_c():
        lst=[]
        for i in range(len(a[0])):
            d = defaultdict(int)
            for j in range(len(a)):
                if a[j][i]==0:
                    continue
                d[a[j][i]]+=1
            result=[]
            for key, value in d.items():
                result.append((key, value))
            result.sort(key=lambda x: (x[1], x[0]))
            tmp=[]
            for x, y in result:
                tmp += [x, y]
            lst.append(tmp)
        mx_l = 0
        for i in range(len(lst)):
            mx_l = max(mx_l, len(lst[i]))
        for i in range(len(lst)):
            lst[i]+=[0]*(mx_l-len(lst[i]))
            if len(lst[i])>100:
                lst[i]=lst[i][:100]
        r_lst=[[0 for _ in range(len(lst))] for _ in range(len(lst[0]))]
        for i in range(len(lst)):
            for j in range(len(lst[0])):
                r_lst[j][i]=lst[i][j]
        return r_lst
    while True:
        if len(a)>r and len(a[0])>c:
            if a[r][c]==k:
                break
        if answer>=100:
            answer=-1
            break
        if len(a)>=len(a[0]):
            a=cul_r()
        else:
            a=cul_c()
        answer+=1
    print(answer)