포시코딩

[프로그래머스][Lv.1] 행렬의 덧셈 본문

자료구조알고리즘/문제풀이

[프로그래머스][Lv.1] 행렬의 덧셈

포시 2022. 12. 25. 03:29
728x90

문제

https://school.programmers.co.kr/learn/courses/30/lessons/12950

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

내 풀이 A

def solution(arr1, arr2):
    answer = []
    for arr12 in zip(arr1, arr2):
        temp = []
        for x in zip(*arr12):
            temp.append(sum(x))
        answer.append(temp)

    return answer

이번 문제에서는 지금까지 다른 사람들의 알고리즘 문제 풀이에서 봤던 몰랐던 기술들을 많이 응용해서 풀었다.

  • * 연산자: Javascript에서 Spread Operator라는 이름으로 쓰는 이 방법으로 list를 개별 요소로 분리했다.
  • sum(): list에 대해 sum(list)를 하여 list 모든 요소의 더한 값을 리턴시켰다.
  • zip(): for문과 zip()을 같이 사용하여 각 list의 원하는 부분만 따로 빼내어 사용할 수 있었다.

 

예전에는 쉬운 문제라면 그냥 풀고 바로 다음 문제로 넘어갔는데

요즘 아무리 쉬운 문제라도 다른 사람은 어떻게 풀었나 보고 넘어가니까

쌓이는 경험치가 다른 것 같다.

 

그리고 이번 문제를 푼 것 처럼 결국에는 나한테 도움이 된다는걸 느꼈는데

다른 풀이도 한 두개만 보는걸로 그치는게 아닌 좀 더 여러 사람의 것을 보며 

자료구조를 사용한다면 꼭 복습하고 넘어가는 습관을 들여야겠다.

 

내 풀이 B

def solution(arr1, arr2):
    answer = [ [ sum(x) for x in zip(*arr12) ] for arr12 in zip(arr1, arr2) ]
    return answer

내가 풀었던 코드에서 리스트 컴프리헨션만 적용해봤다.

거의 다른 코드를 베껴 만든 풀이기 때문에 익숙해지려면 실전에서 많이 시도해봐야 될 것 같다.

 

다른 풀이 A

def solution(arr1, arr2):
    for i in range(len(arr1)):
        for j in range(len(arr1[0])):
            arr1[i][j] += arr2[i][j]
    return arr1

zip()을 떠올리기 전에 생각했던 풀이 방법인데 

좀처럼 정리가 안되어 시도하지 못한 방법이다.

다른 사람의 풀이를 보고 다시금 이렇게 풀어내봤는데

핵심은 주어지는 모든 파라미터가 arr1과 동일한 구조이기 때문에

 

베이스를 arr1로 잡고 for문을 구성하고 

리턴할 값도 arr1의 각 요소에 더해 arr1 그 자체를 리턴할 값으로 만드는 것에 초점을 둬야했다.

 

나는 arr1을 중심으로 하지 않고 계속 arr2나 가상의 테스트에서의 파라미터를 생각하다보니 

복잡해졌던 것 같다.

 

다른 풀이 B

import numpy as np
def solution(arr1, arr2):
    
    arr1 = np.array(arr1)
    arr2 = np.array(arr2)

    answer = arr1 + arr2

    return answer.tolist()

numpy 라이브러리는 배열을 다차원 배열로 만들어 준다.

 

벡터는 1차원 배열(python에서는 list)을 말하지만 

엄밀히 말하면 자료구조상 벡터와 배열은 다른 개념이다. 

2차원 배열도 matrix라고 부르는 것 같은데, 

벡터, 배열, 행렬, vector, array, matrix, 다차원 배열 등등.. 따로 정리를 한번 해야겠다. 

 

아무튼 이 풀이는 numpy를 활용해 푸는 방법인데

애초에 numpy를 코딩테스트에서 사용할 수 있을지 의문이다.

(내장 함수인줄 알았는데 pip install이 필요했다.)

 

그리고 찾아보니 2차원, 3차원 배열에 대해 다루는 방법을 numpy를 통해 다 하는 것 같은데

Javascript에서는 numpy 같은게 없어보였다.

그냥 배열 안의 배열 안의 ... 안의 배열 이런식으로 다차원 배열을 만드나?

 

알고리즘 문제에 다차원 배열에 관해서도 좀 나오는 것 같은데 

이번에 알게된 걸 기회삼아 관련 자료구조를 한번 짚고 넘어가야 될 것 같다.

728x90