BAEKJOON : 10819, 7562, 1991, 2292


No. 10819


1. Problem

2. My Solution
  • で遡及してすべての数列を求め、各数列を合計し、最大出力
  • を出力する.
    import sys
    
    def permutation(level):
        if level >= n:
            res.append(sum(arr.copy()))
        else:
            for i in range(n):
                if visited[i] == True:
                    continue
                visited[i] = True
                arr[level] = nums[i]
                permutation(level+1)
                visited[i] = False
        
    def sum(arr):
        temp = 0
        for i in range(len(arr)-1):
            temp += abs(arr[i] - arr[i+1])
        
        return temp
    
    n = int(sys.stdin.readline())
    nums = list(map(int,sys.stdin.readline().rstrip().split()))
    arr = [0] * n
    visited = [False] * n
    res = []
    
    permutation(0)
    print(max(res))

    No. 7562


    1. Problem

    2. Others' Solutions
  • BFSアルゴリズムによるトラブルシューティング
  • 最短経路
  • を判断すると、その頂点に最初にナビゲートする経路が最短経路
  • である.
  • 最短経路の後の経路は最短経路
  • 以下である.
    import sys
    from collections import deque
    
    def bfs(x,y):
    
        queue = deque()
        queue.append((x,y))
        chess[x][y] = 0     # 원점으로 다시오는 것을 제거
        
        while(queue):
            x,y = queue.popleft()
    
            for dx, dy in move:
                nx = x + dx
                ny = y + dy
    
                # 제일 먼저 해당 좌표값을 수정하는 경로가 최단거리임
                if 0 <= nx < i and 0 <= ny < i and chess[nx][ny] == 1:  # 아직 아무도 방문하지 않았다면 
                    chess[nx][ny] = chess[x][y] + 1
                    queue.append((nx,ny))
                
                if nx == target_x and ny == target_y:
                    return chess[nx][ny]
    
    
    test_n = int(sys.stdin.readline())
    
    for _ in range(test_n):
    
        i = int(sys.stdin.readline())
        target_x, target_y = map(int,sys.stdin.readline().rstrip().split())
        present_x, present_y = map(int,sys.stdin.readline().rstrip().split())
        chess = [[1]*i for _ in range(i)]
        move = [(-2,1),(-1,2),(1,2),(2,1),(2,-1),(1,-2),(-1,-2),(-2,-1)]
    
        if target_x == present_x and target_y == present_y:
            print(0)
        else:
            print(bfs(present_x, present_y))
    
    
    3. Learned
  • DFSアルゴリズムを使用すると、最短パス
  • は保証されない.

    No. 1991


    1. Problem

    2. My Solution
  • ツリーの配列(リスト)は
  • を実現する.
  • バイナリツリー最悪の場合(斜線ツリー)n個の要素が必要な場合2^n-1個の配列空間
  • 2^26-1=4608 MB->メモリオーバーフロー
  • import sys
    sys.setrecursionlimit(10**8)
    
    def preorder(index):
        if index < len(tree):
    
            if tree[index] != '.':
                result[0].append(tree[index])
                
            preorder(index*2+1)
            preorder(index*2+2)
    
    def inorder(index):
        if index < len(tree):
            inorder(index*2+1)
    
            if tree[index] != '.':
                result[1].append(tree[index])
    
            inorder(index*2+2)
    
    def postorder(index):
        if index < len(tree):
            postorder(index*2+1)
            postorder(index*2+2)
    
            if tree[index] != '.':
                result[2].append(tree[index])
        
    
    
    n = int(sys.stdin.readline())
    tree = ['A'] + ['.'] * (2**n -3)    # 경사 이진트리일 경우를 대비
    result = [[],[],[]]
    
    # 트리를 배열(리스트)에 저장
    for i in range(n):
        root, left, right = sys.stdin.readline().rstrip().split()
        tree[tree.index(root)*2+1] = left
        tree[tree.index(root)*2+2] = right
    
    preorder(0)
    inorder(0)
    postorder(0)
    
    for i in range(3):
        print(*result[i], sep='')
  • ソリューション
  • dictデータ型を使用して{文字:index,index:文字}情報
  • を格納
  • は、n*2個のdict空間({".":index}などの不要な値を生成する)
  • のみを使用する.
  • dict.get(index)の戻り値がNoneの場合、配列の範囲を超えているとみなされます.
    import sys
    sys.setrecursionlimit(10**8)
    
    def preorder(index):
        if dict.get(index) and dict[index] != '.':
            result[0].append(dict[index])
            preorder(index*2+1)
            preorder(index*2+2)
    
    def inorder(index):
        if dict.get(index) and dict[index] != '.':
            inorder(index*2+1)
            result[1].append(dict[index])
            inorder(index*2+2)
    
    def postorder(index):
        if dict.get(index) and dict[index] != '.':
            postorder(index*2+1)
            postorder(index*2+2)
            result[2].append(dict[index])
    
           
    n = int(sys.stdin.readline())
    dict = { 0: 'A', 'A': 0}
    result = [[],[],[]]
    
    for i in range(n):
        root, left, right = sys.stdin.readline().rstrip().split()
        dict[dict[root]*2+1], dict[left] = left, dict[root]*2+1
        dict[dict[root]*2+2], dict[right] = right, dict[root]*2+2
    
    preorder(0)
    inorder(0)
    postorder(0)
    
    for i in range(3):
        print(*result[i], sep='')
    3. Learned
  • メモリが過剰であることを考慮して、収集ストレージ、
  • を使用することに注意してください.

    No. 2292


    1. Problem
  • ハニカム問題の復習
  • 2. My Solution
  • このレイヤの最大値より大きい場合は、次のレイヤ
  • に移動する必要があります.
  • の最大値以下の場合->が等しいかそれ以下の場合、レイヤにnが存在し、
  • を終了する.
  • 0レベルは、ボーナスとして増加するだけなら便利なはずです.
    import sys
    
    n = int(sys.stdin.readline())
    level = 0
    level_max = 1
    
    if n == 1:
        print(0)
    else:
        while(n > level_max):
            level_max += (6 * level)
            level += 1
    
    print(level)
    3. Learned
  • 不等号の方向と形状は多様な意味を持つべきである.
    -aがb以下=aがb以下
    -aはbより大きいか=aがbより小さいか...など