출처: 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] 첫 번째 행
i=3: num_list[3:6] 두 번째 행
i=6: num_list[6:9] 세 번째 행
이렇게 됨
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)은 순수한 파이썬 리스트가 아니므로, 문제의 요구 사항을 맞추기 위해 다시 파이썬 리스트의 리스트로 변환하여 반환한다.