HeoBrain AI · DEV · GROWTH

HEO BRAIN · DEV LAB

배운 것을 구조화하고,
실제로 작동하게 만듭니다.

AI, 코딩, 영어, 포트폴리오를 직접 공부하고 만들며 얻은 지식을 누구나 다시 써먹을 수 있게 정리합니다.

heobrain.workflow LIVE
01 collect(experience) 02 structure(knowledge) 03 ship(something useful)

TOPIC HUBS

무엇을 배우고 싶나요?

카테고리를 뒤지지 않아도 목표에 맞는 학습 경로와 글 모음으로 바로 이동합니다.

전체 글 보기

EMAIL NEWSLETTER

새 글을 이메일로 받아보세요

하루 동안 올라온 HeoBrain의 새 글을 매일 오후 8시에 한 통으로 보내드립니다.

인증 이메일의 링크를 눌러야 구독이 완료되며, 언제든 해지할 수 있습니다.

LATEST NOTES

최근에 정리한 글

모든 글 보기

Day 25)프로그래머스_ 정수를 나선형으로 배치하기, 특별한 이차원 배열 2, 정사각형으로 만들기, 이차원 배열 대각선 순회하기

이 글의 목차 펼치기

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

drdc는 행과 열의 이동량이다. (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()로 처리한다.

EMAIL NEWSLETTER

새 글을 이메일로 받아보세요

하루 동안 올라온 HeoBrain의 새 글을 매일 오후 8시에 한 통으로 보내드립니다.

인증 이메일의 링크를 눌러야 구독이 완료되며, 언제든 해지할 수 있습니다.

블로그 검색