[오늘의 문제] 2차원으로 만들기

shlim55·2025년 10월 28일

코딩테스트

목록 보기
162/223

출처: https://school.programmers.co.kr/learn/courses/30/lessons/120842?language=python3

문제 설명
정수 배열 num_list와 정수 n이 매개변수로 주어집니다. num_list를 다음 설명과 같이 2차원 배열로 바꿔 return하도록 solution 함수를 완성해주세요.

num_list가 [1, 2, 3, 4, 5, 6, 7, 8] 로 길이가 8이고 n이 2이므로 num_list를 2 * 4 배열로 다음과 같이 변경합니다. 2차원으로 바꿀 때에는 num_list의 원소들을 앞에서부터 n개씩 나눠 2차원 배열로 변경합니다.

num_list n result
[1, 2, 3, 4, 5, 6, 7, 8] 2 [[1, 2], [3, 4], [5, 6], [7, 8]]
제한사항
num_list의 길이는 n의 배 수개입니다.
0 ≤ num_list의 길이 ≤ 150
2 ≤ n < num_list의 길이
입출력 예
num_list n result
[1, 2, 3, 4, 5, 6, 7, 8] 2 [[1, 2], [3, 4], [5, 6], [7, 8]][100, 95, 2, 4, 5, 6, 18, 33, 948] 3 [[100, 95, 2], [4, 5, 6], [18, 33, 948]]
입출력 예 설명
입출력 예 #1

num_list가 [1, 2, 3, 4, 5, 6, 7, 8] 로 길이가 8이고 n이 2이므로 2 * 4 배열로 변경한 [[1, 2], [3, 4], [5, 6], [7, 8]] 을 return합니다.
입출력 예 #2

num_list가 [100, 95, 2, 4, 5, 6, 18, 33, 948] 로 길이가 9이고 n이 3이므로 3 * 3 배열로 변경한 [[100, 95, 2], [4, 5, 6], [18, 33, 948]] 을 return합니다.

내가 작성한 코드문

def solution(num_list, n):
    answer = [[0 for col in range(n)] for row in range(int(len(num_list)/n))]
    print(answer)
    
    idx = 0
    row = len(num_list)//n
    col = n
    # 배열 길이 8이고 n = 2이면 2 * 4배열로 변경 해야 한다.
    # 행 두개로 변경하기 idx 라는 변수 추가 반복문 밖에, 행, 열 변수도 따로 만들기 
    for i in range(row):  # 행
        for j in range(col): # 열
            answer[i][j] = num_list[idx]
            idx+=1
    
    return answer

트러블 슈팅

일단 반복문 3개해야 하나 하다가
idx 변수 추가에 row와 col까지 변수로 추가 함
2차원 리스트 선언도 힘들었다 사실.

row = len(num_list)//n 이것도 /하나만 썼다.
반복문도 range 없이 row 만쓰고

전반적으로 문법 헷갈리고 그런 날이었다.

다른 사람의 풀이

def solution(num_list, n):
    answer = []
    for i in range(0, len(num_list), n):
        answer.append(num_list[i:i+n])
    return answer

for 반복문과 리스트 슬라이싱을 사용하여 num_list를 n개씩 잘라내는 기법이다.

i는 0부터 시작하여 리스트의 길이(len(num_list))에 도달할 때까지 n만큼 건너 뛴다.

i=0: num_list[0:3] \rightarrow 첫 번째 행
i=3: num_list[3:6] \rightarrow 두 번째 행
i=6: num_list[6:9] \rightarrow 세 번째 행
이렇게 됨

def solution(num_list, n):
    return [num_list[ix-n:ix] for ix in range(n, len(num_list)+1, n)]

리스트 컴프리헨션과 역방향 슬라이싱을 쓴 방법

1.range(n, len(num_list)+1, n): ix는 n부터 시작하여 리스트 길이의 다음 숫자(len(num_list)+1)까지 n만큼 건너뛰면서 증가

2.num_list[ix-n:ix]: 끝 인덱스 ix와 시작 인덱스 ix - n을 사용하여 슬라이싱

3.반복문이 끝나는 동시에 2차원 리스트가 생성되어 반환.

import numpy as np
def solution(num_list, n):
    li = np.array(num_list).reshape(-1,n)
    return li.tolist()

NumPy를 사용한 방법

1.np.array(num_list): 입력된 파이썬 리스트 num_list를 NumPy의 배열(ndarray)로 변환한다.

2.reshape(-1, n): 변환된 배열의 모양(shape)을 바꾼다.

3.li.tolist(): NumPy 배열(li)은 순수한 파이썬 리스트가 아니므로, 문제의 요구 사항을 맞추기 위해 다시 파이썬 리스트의 리스트로 변환하여 반환한다.

profile
A Normal Programmer

0개의 댓글