5 분 소요

정수를 나선형으로 배치하기 ❌

문제 설명

양의 정수 n이 매개변수로 주어집니다. n × n 배열에 1부터 n2 까지 정수를 인덱스 [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의 원소의 길이 ≤ 100
    • arr의 모든 원소의 길이는 같습니다.
  • 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)

댓글남기기