본문 바로가기
Algorithm/프로그래머스(Programmers)

[ 자바스크립트(JS), 파이썬(python) ] 프로그래머스 level1 - 행렬의 덧셈

by YWTechIT 2021. 4. 1.
728x90

📌 행렬의 덧셈

행과 열의 크기가 같은 2차원의 두 행렬을 서로 더한 결과를 반환하는 문제이다.


1️⃣ 파이썬(python) 풀이

1차원 리스트를 더할 때는 어렵지 않았는데, 2차원끼리 더하려고 하니까 조금 어려웠다.
나는 zip함수를 사용했는데, tempzip으로 꺼내온 원소들을 더하고 빈 리스트에 append시켰다. 한 번 돌게 되면 temp를 다시 빈 리스트로 초기화 시키게끔 작성했다. 이 코드는 for range(len)문을 사용하는 것보다 코드의 길이가 아주 조금 줄었지만 가독성이 좋다고 생각하지 않았다.

다른 사람의 코드 중 mapzip(*x)를 활용한 코드가 마음에 들었다.
map은 리스트의 요소를 지정된 함수로 처리해주는 함수이다. 프로그래머스 문제를 풀다 보면 많이 접하는 함수이다.

zip은 동일한 개수로 이루어진 자료형을 묶어주는 역할을 하는데, 인자를 1개로 받게되면 ([1, 2], [3, 4]), ([2, 3], [5, 6]) 처럼 동일한 index값들을 튜플로 하나로 묶어준다.


💡 Asterisk의 사용법

*(asterisk)는 보통 다음과 같은 상황에서 사용되는데 여기서는 unpacking의 목적으로 사용되었다.

  1. 곱셈 및 거듭제곱 연산으로 사용할 때
  2. 리스트형 컨테이너 타입의 데이터를 반복 확장하고자 할 때
  3. 가변 인자 (Variadic Arguments)를 사용하고자 할 때
  4. 컨테이너 타입의 데이터를 Unpacking 할 때

이 코드의 풀이 순서는 다음과 같다. zip을 사용할 때는 *(asterisk)를 잘 활용하자!

  1. for x in zip(arr1, arr2): ([1, 2], [3, 4]), ([2, 3], [5, 6])
  2. map(sum, zip(*x)): unpacking한 값([1, 2], [3, 4], [2, 3], [5, 6])에서 동일한 index끼리 더해준(sum) 값을 다시 리스트에 담는다.
  3. 출력: [[4, 6], [7, 9]]
# 내 코드 1
def solution(arr1, arr2):
    result = []
    for i, j in zip(arr1, arr2):
        temp = []
        for k, m in zip(i, j):
            temp.append(k+m)
        result.append(temp)
    return result

# `내 코드 1`을 comprehension으로 작성한 코드
def solution(arr1, arr2):
    return [[k+m for k, m in zip(i,j)] for i, j in zip(arr1, arr2)]

# 다른 사람의 코드
def solution(arr1, arr2):
    return [list(map(sum, zip(*x))) for x in zip(arr1, arr2)]
728x90

2️⃣ 자바스크립트(JS) 풀이(21. 8. 2.)

`for`문 대신 `map`을 사용하면 훨씬 가독성이 좋아진다. 또 처음 `map`에서 나온 `item`에 또 `map`을 적용해서 리스트를 벗길 수 있다. 자주 써먹어야겠다. 주의할 점은 `map`은 배열을 `return`시킨다는 점이다.

// 나의 코드
function solution(arr1, arr2, answer = []) {
    const rowLength = arr1.length;
    const columnLength = arr1[0].length;
    
    for (let i = 0; i < rowLength; i++){
        let tmpAnswer = [];
        for (let j = 0; j < columnLength; j++){
            tmpAnswer.push(arr1[i][j] + arr2[i][j])
        }
        answer.push(tmpAnswer)
    }
    return answer
}
// 수정 코드
function solution(arr1, arr2, answer = []) {
  for (let i = 0; i < arr1.length; i++) {
    answer[i] = [];
    for (let j = 0; j < arr1[i].length; j++) {
      answer[i].push(arr1[i][j] + arr2[i][j]);
    }
  }
  return answer;
}
// 다른 사람의 코드
function solution(arr1, arr2) {
    return arr1.map((item, i) => item.map((val, j) => val + arr2[i][j]))
  }
반응형

댓글