Python 코딩테스트 Day 25 학습 기록
이번에는 이차원 리스트 문제 네 가지를 정리한다. 정수를 나선형으로 배치하기, 특별한 이차원 배열 2, 정사각형으로 만들기, 이차원 배열 대각선 순회하기를 풀이 과정과 함께 복습한다.
1. 정수를 나선형으로 배치하기
왼쪽 위에서 시작해 오른쪽, 아래, 왼쪽, 위 방향으로 이동하며 1부터 n 제곱까지 채우는 문제다. 다음 칸이 배열 밖이거나 이미 채워져 있으면 방향을 바꾼다.
def solution(n):
answer = [[0] * n for _ in range(n)]
dr = [0, 1, 0, -1]
dc = [1, 0, -1, 0]
row = 0
col = 0
direction = 0
for number in range(1, n * n + 1):
answer[row][col] = number
next_row = row + dr[direction]
next_col = col + dc[direction]
if (next_row < 0 or next_row >= n or
next_col < 0 or next_col >= n or
answer[next_row][next_col] != 0):
direction = (direction + 1) % 4
next_row = row + dr[direction]
next_col = col + dc[direction]
row = next_row
col = next_col
return answer
dr와 dc는 행과 열의 이동량이다. (direction + 1) % 4를 사용하면 네 방향을 순서대로 반복할 수 있다. [[0] * n] * n은 모든 행이 같은 리스트를 참조하므로 사용하지 않는다.
2. 특별한 이차원 배열 2
대칭 배열은 모든 위치에서 arr[i][j] == arr[j][i]가 성립하는 배열이다.
def solution(arr):
return int(arr == list(map(list, zip(*arr))))
*arr는 각 행을 풀어 전달하고, zip(*arr)는 같은 열 번호의 값을 묶어 전치한다. 원본과 전치 결과가 같으면 대칭이므로 True를 1로 바꿔 반환한다.
def solution(arr):
n = len(arr)
for i in range(n):
for j in range(n):
if arr[i][j] != arr[j][i]:
return 0
return 1
초보자에게는 반복문 풀이가 먼저다. 다른 값 하나를 찾으면 바로 0을 반환하므로 흐름도 분명하다.
3. 정사각형으로 만들기
행 수가 더 많으면 각 행 끝에 0을 추가하고, 열 수가 더 많으면 0으로 채운 새 행을 추가한다.
def solution(arr):
floors = len(arr)
rooms = len(arr[0])
if floors > rooms:
diff = floors - rooms
for i in range(floors):
arr[i].extend([0] * diff)
elif rooms > floors:
diff = rooms - floors
for _ in range(diff):
arr.append([0] * rooms)
return arr
floors는 행 수, rooms는 열 수, diff는 부족한 수다. extend()는 기존 행 끝에 여러 값을 붙이고, append()는 새 행 하나를 추가한다.
def solution(arr):
n = len(arr)
m = len(arr[0])
if n > m:
for i in range(n):
for _ in range(n - m):
arr[i].append(0)
else:
for _ in range(m - n):
arr.append([0] * m)
return arr
한 칸씩 append(0)하는 이 풀이도 정답이다. 이미 정사각형이면 range(0)이 되어 아무 작업도 하지 않는다.
4. 이차원 배열 대각선 순회하기
행 번호 i와 열 번호 j의 합이 k 이하인 칸, 즉 i + j <= k인 값만 더한다.
def solution(board, k):
answer = 0
rows = len(board)
columns = len(board[0])
for i in range(rows):
for j in range(columns):
if i + j <= k:
answer += board[i][j]
return answer
i는 행 번호이므로 range(rows), j는 열 번호이므로 range(columns)으로 반복한다. board[i]는 한 행 전체이고, 숫자 하나는 board[i][j]다. 합계를 만들 때는 answer =이 아니라 answer +=를 사용한다.
Day 25 체크
행 수는 len(arr), 열 수는 len(arr[0])이다. 한 행은 arr[i], 한 칸은 arr[i][j]다. 새 행은 append(), 기존 행 끝의 여러 값은 extend()로 처리한다.
'Coding_Test > Lv0' 카테고리의 다른 글
| Day24)프로그래머스_공통 가격과 추가 가격을 분리하는 방법, 그림 확대, 조건에 따른 리스트 변환, 문자열 비교, 단위 행렬 만들기 (0) | 2026.08.05 |
|---|