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

neoneoneo·2024년 2월 28일
0

kotlin

목록 보기
17/49

문제

행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.

고수의 풀이_1

class Solution {
    fun solution(arr1: Array<IntArray>, arr2: Array<IntArray>): Array<IntArray> {
        var answer = arrayOf<IntArray>()
        answer = arr1.zip(arr2) { a, b ->
            (a zip b).map { (x, y) -> x + y }.toIntArray()
        }.toTypedArray()
        return answer
    }
}
  • arr1.zip(arr2) : 두 개의 2차원 배열을 zip하여 List< List < Int > >가 생성된다.
  • a, b -> : a는 arr2, b는 arr2에서 동일한 인덱스에 위치한 1차원 배열을 나타낸다.
  • (a zip b) : a, b의 동일한 인덱스에 위치한 요소들을 쌍으로 묶어 List< Pair < Int, Int > >를 생성한다.
  • .map { (x, y) -> x + y } : 각 쌍의 요소들을 더하고 그 결과로 List< Int >를 생성한다.
  • .toIntArray() : IntArray로 변환한다.
  • .toTypedArray() : 리스트의 리스트를 2차원 배열로 변환한다.

고수의 풀이_2

  class Solution {
    fun solution(arr1: Array<IntArray>, arr2: Array<IntArray>): Array<IntArray> {
        return Array(arr1.size) {
            row ->
            IntArray(arr1[0].size) {
                col ->
                arr1[row][col] + arr2[row][col]
            }
        }
    }
}
  • Array(arr1.size) : 결과로 반환할 배열을 생성하며, 행의 개수는 arr1의 개수와 동일하게 생성한다.
  • { row -> .. } : 각 행에 대한 람다식으로 행 인덱스 row를 매개변수로 받아서 처리한다.
  • IntArray(arr1[0].size) : 각 행마다 새로운 IntArray를 생성한다. 열의 개수는 arr1의 열의 개수와 동일하다.
  • { col -> .. } : 각 열에 대한 람다식으로 열 인덱스 col을 매개변수로 받아서 처리한다.
  • arr1[row][col] + arr2[row][col] : 각 행과 열에 위치한 요소를 더한다.

배운점

  • 풀기는 풀었지만.. 내 힘으로 풀었다고 하기는 어려울 것 같아 이번에는 고수의 풀이를 2개만 공부한다.
  • zip과 map을 같이 쓸 수도 있다는 점과 Array에서 row와 col을 저런식으로 활용할 수 있다는 점이 새로웠다.
  • 고수의 풀이_2는 row로 행의 자리를 만들고, col로 열의 자리를 만들어서 각각의 인덱스에 처리 값이 들어가도록 짠 것 같은데, 대단하다. 애초에 배열을 초기화하면서 처리 값을 넣어버리는 방식이다. 이번 기회에 Array에 대해서 좀 더 공부해보자.
    • 아래는 Array {} 안에서 row, col을 명세하는 방식 사례이다. Array는 Array(size) {index -> element}와 같은 형태를 가지며, index는 row, col에 대해서 초기화 람다식을 사용할 수 있다.
     Array(3) { row ->
         IntArray(2) { col ->
             row + col
       }
     }
---
_[TIL-240228]_

0개의 댓글