プログラマー|カタツムリ

22644 ワード

1.カタツムリ


質問リンク:
https://programmers.co.kr/learn/courses/30/lessons/68645?language=python3

1.1回答


試行1:(失敗)インデックスの置換、追加、削除のルール
  • [0,0],.., [3,0]3、インデックス+1
  • を変更してください.
  • [3,1],...,[3,3]3、インデックス-1
  • を変更してください.
  • [2,2],[1,1],[0,0]アクセスした[0,0]を削除し、1に達した後、最後に[2,1]?
  • ルールを特定することは困難です.コードは返されません.
  • def solution(n):
        # [[0,0], [1,0], [1,1], [2,0], [2,1], [2,2],...]
        q = []
        for i in range(n+1):
            q.extend([[i, k] for k in range(i+1)])
        
        now = [0,0]
        index = 0 # 처음에는 인덱스 0번째부터 늘어남. 
        answer = [] # 달팽이 채우는 인덱스
    
        while q:
            if now in q:
                q.remove(now)
                answer.append(now)
            now[index] += 1
            if now not in q: # q에 포함되어 있지 않으면
                now[index] -= 1 # 원래대로 돌려놓는다.
                index = (index+1)%2 #인덱스 체인지
            if now[0] < now[1]:
                
                
            
            
        return q
    試行2:反映方向の繰り返し
  • 方向は下、右、上、...繰り返します.move作成関数
  • nが100より大きい場合にタイムアウトする.nが増えるにつれて、時間が急激に増える可能性があります.
  • 3つのテストケースの実行時エラー.長さは(n+1)*n/2であるため、nが100より大きいと長時間
  • かかる場合がある
    def solution(n):
        
        def move(x, y, direction):
            if direction == 0: # 아래
                return [x+1, y]
            elif direction == 1: # 오른쪽
                return [x, y+1]
            else: # 위
                return [x-1, y-1]
            
        total = (n+1)*n//2
        now = [0, 0]
        q = [now] 
        direction = 0
        for i in range(1, total):
            tmp = move(now[0], now[1], direction)
            if n in tmp or tmp[0]<tmp[1] or tmp in q:
                direction = (direction+1)%3
            now = move(now[0], now[1], direction)
            q.append(now)
    
        for i in range(len(q)):
            q[i].append(i+1) 
        q.sort(key= lambda x: (x[0], x[1]))
        answer = [x[2] for x in q]
        
        
        return answer

    1.2他者コードを参照

  • [[1], [2, 9], [3, 10, 8], [4, 5, 6, 7]]sum(answer,[])を求め、2次元を1次元に縮小する.(複数の方法.下記参照)
  • def solution(n):
        
        def move(x, y, direction):
            if direction == 0: # 아래
                return x+1, y
            elif direction == 1: # 오른쪽
                return x, y+1
            else: # 위
                return x-1, y-1
            
        x,y = 0, 0
        num = 1
        direction = 0
        answer = [[0]*i for i in range(1, n+1)]
        while num <= (n+1)*n//2:
            answer[x][y] = num
            nx, ny = move(x,y,direction)
            num += 1
            
            #0<=ny<=nx<n이고 아직 채우기 전이라면
            if 0<=nx<n and 0<=ny<=nx and answer[nx][ny] == 0: 
                x,y = nx,ny
            else:
                direction = (direction+1)%3
                x,y = move(x,y,direction)
                
        return sum(answer,[])

    注)2 Dリストを1 Dリストとして作成する


    📍 参照リンク:https://programmers.co.kr/learn/courses/4008/lessons/12738
    ( https://programmers.co.kr/learn/courses/4008 )
    重複文を使用してリストを追加できますが.
    my_list = [[1, 2], [3, 4], [5, 6]]
    answer = []
    for element in my_list:
        answer += element
    Pythonでは、for文を使わずにリストに接続できます.
  • itertools.chain
  • my_list = [[1, 2], [3, 4], [5, 6]]
    
    # 방법 1 - sum 함수
    answer = sum(my_list, [])
    
    # 방법 2 - itertools.chain
    import itertools
    list(itertools.chain.from_iterable(my_list))
    
    # 방법 3 - itertools와 unpacking
    import itertools
    list(itertools.chain(*my_list))
    
    # 방법 4 - list comprehension 이용
    [element for array in my_list for element in array]
    
    # 방법 5 - reduce 함수 이용 1
    from functools import reduce
    list(reduce(lambda x, y: x+y, my_list))
    
    # 방법 6 - reduce 함수 이용 2
    from functools import reduce
    import operator
    list(reduce(operator.add, my_list))
    各要素の長さが同じであればnumpyのフラット化も使用できます.
    # 방법 7 - numpy 라이브러리의 flatten 이용
    import numpy as np
    np.array(my_list).flatten().tolist()