[코딩 기초 트레이닝]Day25 이차원 리스트(배열)
정수를 나선형으로 배치하기 ❌
문제 설명
양의 정수 n
이 매개변수로 주어집니다. n
× n
배열에 1부터 n
2 까지 정수를 인덱스 [0][0]부터 시계방향 나선형으로 배치한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.
제한사항
- 1 ≤
n
≤ 30
입출력 예
n | result |
---|---|
4 | [[1, 2, 3, 4], [12, 13, 14, 5], [11, 16, 15, 6], [10, 9, 8, 7]] |
5 | [[1, 2, 3, 4, 5], [16, 17, 18, 19, 6], [15, 24, 25, 20, 7], [14, 23, 22, 21, 8], [13, 12, 11, 10, 9]] |
이 문제는 잘 모르겠습니다. 그래서 여러 답을 보고 외워야겠습니다.
solution
def solution(n):
if n == 1:
return [[1]]
answer = [[0 for j in range(n)] for i in range(n)] # 배열 초기화
x = 0
y = 0
dir = 'r'
for i in range(n*n):
answer[x][y] = i + 1
if dir == 'r':
y += 1
if y == n-1 or answer[x][y+1] != 0: # 맨 끝에 도달했거나 가려는 곳에 이미 값이 있으면 방향 전환
dir = 'd'
elif dir == 'd':
x += 1
if x == n-1 or answer[x+1][y] != 0:
dir = 'l'
elif dir == 'l':
y -= 1
if y == 0 or answer[x][y-1] != 0:
dir = 'u'
elif dir == 'u':
x -= 1
if x == n-1 or answer[x-1][y] != 0:
dir = 'r'
return answer
def solution(n):
answer = [[0]*n for _ in range(n)]
#우,하,좌,상
dx=[0,1,0,-1]
dy=[1,0,-1,0]
x,y=0,0
answer[x][y]=1
k=2
while k<=n*n:
for i in range(4):
while True:
nx=x+dx[i]
ny=y+dy[i]
if nx>=n or ny>=n or nx<0 or ny<0 or answer[nx][ny]!=0:
break
else:
answer[nx][ny]=k
x=nx
y=ny
k+=1
return answer
def solution(n):
answer = [[None for j in range(n)] for i in range(n)]
move = [[0, 1], [1, 0], [0, -1], [-1, 0]]
x, y, m = 0, 0, 0
for i in range(1, n**2 + 1):
answer[y][x] = i
if y + move[m][0] >= n or x + move[m][1] >= n or answer[y + move[m][0]][x + move[m][1]]:
m = (m + 1) % len(move)
y, x = y + move[m][0], x + move[m][1]
return answer
def solution(n):
dy = [0, 1, 0, -1]
dx = [1, 0, -1, 0]
y, x = 0, -1
arr = [[0] * n for _ in range(n)]
cnt = 1
direction = 0
while cnt <= n**2:
ny, nx = y + dy[direction], x + dx[direction]
if 0 <= ny < n and 0 <= nx < n and not arr[ny][nx]:
arr[ny][nx] = cnt
cnt += 1
y, x = ny, nx
else:
direction = (direction + 1) % 4
return arr
특별한 이차원 배열 2
문제 설명
n × n 크기의 이차원 배열 arr
이 매개변수로 주어질 때, arr
이 다음을 만족하면 1을 아니라면 0을 return 하는 solution 함수를 작성해 주세요.
- 0 ≤ i, j < n인 정수 i, j에 대하여
arr[i][j]
=arr[j][i]
제한사항
- 1 ≤
arr
의 길이 =arr
의 원소의 길이 ≤ 100 - 1 ≤
arr
의 원소의 원소 ≤ 1,000 - 모든
arr
의 원소의 길이는 같습니다.
입출력 예
arr | result |
---|---|
[[5, 192, 33], [192, 72, 95], [33, 95, 999]] | 1 |
[[19, 498, 258, 587], [63, 93, 7, 754], [258, 7, 1000, 723], [587, 754, 723, 81]] | 0 |
solution
def solution(arr):
for i in range(len(arr)):
for j in range(len(arr)):
if arr[i][j] != arr[j][i]:
return 0
return 1
def solution(arr):
return int(arr == list(map(list, zip(*arr))))
여기서 사용한 *****은 unpack이라는 것입니다.
*는 하나의 튜플을 각각의 요소로 분리해줍니다. unpack이라고 합니다.
def sum(a, b)
return a + b
input = (1, 2)
print(sum(*input))
함수 sum에는 두개의 값이 들어가야하는데 input이라는 배열이 들어갔습니다. 이 배열을 풀어서 각각의 매개변수에 넣어 준 것입니다.
list도 각각 분리 가능합니다.
num_list = [1, 2, 3]
print(*num_list)
1, 2, 3
이렇게 출력됩니다.
딕셔너리에서도 사용가능합니다.
def sum(a, b)
return a + b
num_dict = {'b' : 2, 'a': 1}
print(sum(**num_dict))
여기서 사용한 것은 2차원 행렬 뒤집기입니다.
2차원 배열의 행과 열을 바꾸는 것을 zip과 unpack operator로 구현할 수 있습니다.
1 2 3 4 1 5 9 13
5 6 7 8 2 6 10 14
9 10 11 12 3 7 11 15
13 14 15 16 4 8 12 16
num_list = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]
list(map(list, zip(*num_list)))
리스트의 두 요소 값을 합치는 것도 zip을 통해 가능합니다.
A = [0. 1. 2. 3. 4]
B = [0, 1, 2, 3, 4]
list(x+y for x, y in zip(a, b) )
[0, 2, 4, 6, 8]
정사각형으로 만들기
문제 설명
이차원 정수 배열 arr
이 매개변수로 주어집니다. arr
의 행의 수가 더 많다면 열의 수가 행의 수와 같아지도록 각 행의 끝에 0을 추가하고, 열의 수가 더 많다면 행의 수가 열의 수와 같아지도록 각 열의 끝에 0을 추가한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.
제한사항
- 1 ≤
arr
의 길이 ≤ 100 - 1 ≤
arr
의 원소의 길이 ≤ 100arr
의 모든 원소의 길이는 같습니다.
- 1 ≤
arr
의 원소의 원소 ≤ 1,000
입출력 예
arr | result |
---|---|
[[572, 22, 37], [287, 726, 384], [85, 137, 292], [487, 13, 876]] | [[572, 22, 37, 0], [287, 726, 384, 0], [85, 137, 292, 0], [487, 13, 876, 0]] |
[[57, 192, 534, 2], [9, 345, 192, 999]] | [[57, 192, 534, 2], [9, 345, 192, 999], [0, 0, 0, 0], [0, 0, 0, 0]] |
[[1, 2], [3, 4]] | [[1, 2], [3, 4]] |
solution
def solution(arr):
for i in arr:
if len(i) < len(arr):
i += [0]*(len(arr)-len(i))
elif len(i) > len(arr):
arr += [[0*len(i)]]*(len(i)-len(arr))
return arr
이차원 배열 대각선 순회하기
문제 설명
2차원 정수 배열 board
와 정수 k
가 주어집니다.
i
+ j
<= k
를 만족하는 모든 (i
, j
)에 대한 board[i][j]
의 합을 return 하는 solution 함수를 완성해 주세요.
제한사항
- 1 ≤ board의 길이 ≤ 100
- 1 ≤ board[i]의 길이 ≤ 100
- 1 ≤ board[i][j] ≤ 10,000
- 모든 board[i]의 길이는 같습니다.
- 0 ≤ k < board의 길이 + board[i]의 길이
입출력 예
board | k | result |
---|---|---|
[[0, 1, 2],[1, 2, 3],[2, 3, 4],[3, 4, 5]] | 2 | 8 |
solution
def solution(board, k):
sum = 0
for i, v in enumerate(board):
for j in range(len(v)):
if i + j <= k:
sum += board[i][j]
return sum
def solution(board, k):
return sum(board[i][j] for i in range(len(board)) for j in range(len(board[0])) if i + j <= k)
댓글남기기