코딩 테스트/Level 1

20. 행렬의 덧셈

컴닥 2019. 10. 18. 15:49
반응형

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

 

파이썬

기본적인 풀이입니다. 

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

리스트 컴프리헨션을 사용해서 줄일 수도 있습니다만 점점 가독성이 안 좋아집니다. 

리스트 컴프리헨션을 2중으로 쓰는 것은 좋지 않습니다. 

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

그럼 다른 방법은 뭐가 있을까요? zip()을 이용해서 줄여보는 건 어떨까요? 

이것도 2중 for 문이라 가독성이 좋다고는 할 수 없습니다만, 인덱스가 없기 때문에 좀 더 깔끔합니다. 

def solution(arr1, arr2):
    return [[el1 + el2 for el1, el2 in zip(row1, row2)] for row1, row2 in zip(arr1, arr2)]

 

자바스크립트

함수형으로 풀어봅니다. 

자바스크립트는 특이하게(?) 인덱스가 나옵니다. 

function solution(arr1, arr2) {
        return arr1.map((e1, i) => e1.map((e2, j) => e2 + arr2[i][j]))
}

 

자바

기본적인 해법으로 풀어봤습니다. 

class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {
        int[][] answer = new int[arr1.length][arr1[0].length];
        for (int i = 0; i < arr1.length; i++) {
            for (int j = 0; j < arr1[0].length; j++) {
                answer[i][j] = arr1[i][j] + arr2[i][j];
            }
        }
        return answer;
    }
}

 

코틀린

자바스크립트와 유사합니다. 

https://medium.com/@dambyworld/%EC%9E%90%EB%B0%94%EC%9D%98-mapindexed-%EC%BD%94%ED%8B%80%EB%A6%B0%EC%9D%98-mapindexed-eae16d2d1150

class Solution {
    fun solution(arr1: Array<IntArray>, arr2: Array<IntArray>): Array<IntArray> {
        return arr1.mapIndexed { i, e1 -> e1.mapIndexed { j, e2 -> e2 + arr2[i][j] }.toIntArray() }.toTypedArray()
    }
}

 

func solution(arr1 [][]int, arr2 [][]int) [][]int {
	r := make([][]int, len(arr1))
	for i := 0; i < len(arr1); i++ {
		r[i] = make([]int, len(arr1[i]))
		for j := 0; j < len(arr1[i]); j++ {
			r[i][j] = arr1[i][j]+arr2[i][j]
		}
	}
	return r
}

 

C#

public class Solution
{
    public int[,] solution(int[,] arr1, int[,] arr2)
    {
        int[,] answer = new int[arr1.GetLength(0), arr1.GetLength(1)];
        for (int i = 0; i < arr1.GetLength(0); i++)
            for (int j = 0; j < arr1.GetLength(1); j++)
                answer[i, j] = arr1[i, j] + arr2[i, j];
        return answer;
    }
}

 

반응형