[프로그래머스] 2차원으로 만들기

Jiumn·2022년 12월 13일
0
post-thumbnail

[프로그래머스] 2차원으로 만들기

문제 설명

정수 배열 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차원 배열로 변경합니다.

입출력 예 설명

입출력 예 #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합니다.

풀이

import numpy as np

def solution(num_list, n):
    return (np.array(num_list).reshape((len(num_list) // n ,n))).tolist()

우선 numpy라는 라이브러리를 import 한다.
(알고리즘 문제에서 라이브러리를 사용하는 게 좋은 건지는 모르겠지만...
프로그래머스 문제에서 종종 보기도 했고 모르는 개념이므로 이 참에 정리해보려고 한다.)

왜 numpy를 사용할까?

numpy가 무엇인지에 앞서 왜 이 라이브러리를 사용하는지 궁금했다.

다양한 설명이 있었는데 내가 이해하기엔 쉽지 않아서 방황하다...
그나마 쉽게 설명된 글을 찾았다.

파이썬의 내장 기능인 리스트 또한 Numpy 배열과 동일한 기능을 제공할 수 있기 때문에 왜 Numpy를 사용해야 하는지 의문이 듭니다. 배열의 크기가 작으면 문제가 되지 않지만 Numpy 배열은 데이터의 크기가 커질수록 저장 및 가공을 하는데 효율성을 보장합니다. (출처: https://brownbears.tistory.com/480)

우선 np.array()의 인자에 기존 파이썬 배열을 넣으면 쉼표가 없는 형태의 배열이 반환된다.

import numpy as np

a = np.array([1,2,3])                                  
print(a)
>> [1 2 3]

결과값으로 출력된 [1 2 3]는 요상한 형태의 배열이다.
이것은 ndarray라고 하는데, N차원 배열 객체라고 한다.

음... N차원 배열 객체...?

아무래도 이 개념을 지금 완전히 이해하기에는 어려울 것 같으니
먼저 파이썬의 list와 numpy의 ndarray는 어떤 차이가 있는지 찾아보자.

Python의 list는 메모리에 공간을 할당하여 데이터를 저장하고, 그 주소를 연결합니다. 이때 값을 찾아야 하기 때문에 추가 연산이 필요합니다. 하지만 numpy ndarray는 차례대로 메모리를 할당하여 데이터를 쌓는 구조입니다. 그래서 연산이 더 빠릅니다.
출처: numpy ndarray, python list 차이 : 네이버 블로그

또한 찾아본 바로는 파이썬은 array를 지원하지 않는다고 한다.
list와 array는 엄연히 다른 자료형이라고 한다.

Array는 정적 할당에 해당하며, List의 경우는 동적 할당에 해당합니다.
동적으로 계속 크기가 변할 수 있는 Python List와 달리 NumPy Array는 고정된 크기를 갖습니다. Size를 변화하면 기존의 array를 삭제하고 새로운 array를 생성해야 합니다.
출처: https://chancoding.tistory.com/10

여기까지 살펴봤으면 다시 풀이로 돌아가서...

import numpy as np

def solution(num_list, n):
    return (np.array(num_list).reshape((len(num_list) // n ,n))).tolist()
  • np.array(num_list): num_list를 ndarray 형태로 변환한다.
  • reshape((len(num_list) // n,n)): ndarray를 num_list의 길이를 n으로 나눴을 때 몫을 행으로, n을 열로 갖는 형태로 변환(reshape)한다.
  • tolist(): 다시 파이썬의 list 형태로 변환한다.
profile
Back-End Wep Developer. 꾸준함이 능력이다.

0개의 댓글