BAEKJOON : 14500, 1748, 15649


No. 17299


1. Problem

2. Others' Solutions
  • テトルミノで表現できるすべての図形の形状を考えてみましょう->19個
  • 各モデルは4 x 4プレート(0,0)の座標で
  • として表す.
  • に与えられた碁盤格子(0,0)から(n,m)の各一格まで、
  • と判断する.
    import sys
    import math
    
    tetrominos = [
        [(0,0),(0,1),(0,2),(0,3)],  # ㅡ
        [(0,0),(1,0),(2,0),(3,0)],  # ㅣ
    
        [(0,0),(1,0),(0,1),(1,1)],  # ㅁ
    
        [(0,0),(1,0),(2,0),(2,1)],  # ㄴ
        [(1,0),(1,1),(1,2),(0,2)],
        [(0,0),(0,1),(1,1),(2,1)],
        [(0,0),(0,1),(0,2),(1,0)],
    
        [(2,0),(2,1),(1,1),(0,1)],
        [(0,0),(0,1),(0,2),(1,2)],
        [(0,0),(0,1),(1,0),(2,0)],
        [(0,0),(1,0),(1,1),(1,2)],
    
        [(0,0),(1,0),(1,1),(2,1)],  # ㄴㄱ
        [(1,0),(1,1),(0,1),(0,2)],
        [(0,1),(2,0),(1,1),(1,0)],
        [(0,0),(0,1),(1,1),(1,2)],
    
        [(0,1),(1,0),(1,1),(1,2)],  # ㅗ
        [(1,0),(0,1),(1,1),(2,1)],
        [(0,0),(0,1),(0,2),(1,1)],
        [(0,0),(1,0),(1,1),(2,0)]]
      
    n,m = map(int, sys.stdin.readline().rstrip().split())
    board = []
    result = 0
    
    for _ in range(n):
        board.append(list(map(int,sys.stdin.readline().rstrip().split())))
    
    for i in range(n):                      # 열 이동
        for j in range(m):                  # 행 이동
            for tetromino in tetrominos:    # 19개의 테트로미노에서 하나씩 선택
    
                temp = 0
    
                for dx,dy in tetromino:     # 기준 좌표 board[i][j]에서 테트로미노에 맞게 dx,dy 좌표 더해줌
    
                    ix = i + dx
                    jy = j + dy
    
                    if 0 <= ix < n and 0 <= jy < m:     
                        temp += board[ix][jy]
                    else:                   # 범위를 넘어가면 result 로 채택될 수 없도록  -inf 값 지정
                        temp = -(math.inf)
                        break
    
                if result < temp:           # 테트로미노 하나씩 마다 result 갱신가능 여부 판단
                    result = temp 
    
    print(result)
    
  • DFSアルゴリズムを用いた解題方法は,今後の学習で試みる.
    3. Learned
  • グラフィック(シェイプ)の問題は、通常、座標(2 Dリスト)
  • に基づいている.
  • (0,0)を基準として図形(テクスチャ)を表す、異なる基準座標のみで表す原理を用いて、
  • .
  • 所定のプレートの範囲を超えた場合の解決方法
    -前述したように、サイズ比較による分岐
    -各行に3を追加したボードに-inf値を追加し、結果として使用しないようにします.
    -exceptionを使用して
  • に進みます.

    No. 1748


    1. Problem

    2. My Solution
  • 1桁ごとに1桁、2桁ごとに2桁増加...9桁増加ごとに
  • 1~9は9個、10~99は90個、100~999は900個...
  • 120であれば(1桁*1)+(2桁*2)値に(120-99)*3
  • を加算
  • ビットルール(各ビット数のすべての数値*各ビット数の値)を使用するために、
  • が予め記憶されている.
    import sys
    
    n = sys.stdin.readline().rstrip()
    count = [0,9,180,2700,36000,450000,5400000,63000000,720000000]
    res = 0
    
    if len(n) == 1:
        print(n)
    else:
        for i in range(1,len(n)):
            res += count[i]
        res += (int(n) - int('9' * (len(n) - 1))) * len(n)
        print(res)
    3. Others' Solutions
  • 9, 90, 900 ... (10*i)
  • を使用してfor文を使用して生成
  • 120は120-100+1の原理を利用して120-99ではなく3桁の
  • を実現する.
    import sys
    
    n = sys.stdin.readline().rstrip()
    res = 0
    
    for i in range(len(n)-1):
        res += 9 * (10 ** i) * (i+1)
    
    print(res + ((int(n) - (10 ** (len(n)-1)) + 1) * len(n)))
    4. Learned
    (10*i)原理を用いて
  • 9,90,900,9000,計
  • を生成する.

    No. 15649


    1. Problem

    2. My Solution
  • 1からNまで、自然水体中でM個の数列=シーケンス
  • を繰り返し選択しない
  • 第1の方法
  • res.append(arr)を使用してarrを挿入するのは、resリストにarrの値を挿入するのではなく、res[index]がarrを参照(指向)する原理
  • である.
    したがって、arr値を変更するたびに、resリストの要素(res[index])も変更値を示す.
    import sys
    
    def permutation(level):
        if level >= m:
            res.append(arr)
        else:
            for i in range(1, n+1):
                if visited[i] == True:
                    continue
                else:
                    arr[level] = i
                    visited[i] = True
                    permutation(level+1)
                    visited[i] = False
    
    n, m = map(int,sys.stdin.readline().rstrip().split())
    
    visited = [False] * (n+1)
    arr = [0] * m
    res = []
    
    permutation(0)
    
    for i in res:
        print(' '.join(map(str,i)))
  • 第2の方法
  • res.append(arr)を使用してarr自体を挿入するのではなく、res.append(arr.copy()を使用して
  • を挿入します.
    import sys
    
    def permutation(level):
        if level >= m:
            res.append(arr.copy())
        else:
            for i in range(1, n+1):
                if visited[i] == True:
                    continue
                else:
                    arr[level] = i
                    visited[i] = True
                    permutation(level+1)
                    visited[i] = False
    
    n, m = map(int,sys.stdin.readline().rstrip().split())
    
    visited = [False] * (n+1)
    arr = [0] * m
    res = []
    
    permutation(0)
    for i in res:
        print(' '.join(map(str,i)))
    3. Others' Solutions

  • 4. Learned
  • Pythonでは、デフォルトのデータ型を格納するのではなく、リスト内の各要素(リスト[インデックス])が値(オブジェクト)を参照します.
  • の値を保存するために.copy()関数を使用して新しいオブジェクトを作成しますか?作成する場合は、
  • を参照してください.