プログラマー|カタツムリ
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
作成関数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文を使わずにリストに接続できます.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()
Reference
この問題について(プログラマー|カタツムリ), 我々は、より多くの情報をここで見つけました https://velog.io/@hong_journey/프로그래머스-삼각-달팽이テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol