🔴 문제
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/12950
문제 설명
행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다.
2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.
제한 조건
행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않습니다.
입출력 예
🟠 시행착오
🙅🏻♀️ 배열끼리의 연산 불가능 (arr1 + arr2 ❌)
arr1 + arr2 는 안 된다.
[1,2,3] + [4,5,6] => [1,2,3,4,5,6]이 되듯,
그냥 리스트를 이어 붙이는 꼴이 되기 때문이다.
var arr1 = [[1,2],[2,3]]
var arr2 = [[3,4],[5,6]]
print(arr1 + arr2) // [[1, 2], [2, 3], [3, 4], [5, 6]]
파이썬도 마찬가지로 [1,2,3] + [4,5,6] = [1,2,3,4,5,6] 이 된다.
그러나 numPy 라이브러리를 사용하면 [1,2,3] + [4,5,6] = [5,7,9]가 된다.
Swift에도 numPy같은 라이브러리가 있는지는 모르겠다...
🙅🏻♀️ 배열 초기화 문제 ([[]]에 값 담기 ❌)
배열끼리의 연산이 불가능하므로,
직접 arr1과 arr2의 요소에 접근하여 연산을 해주는 수밖에 없다.
그래서 다음과 같이 for 반복문을 사용해 2차원 배열에 접근했다.
결과는 EXC_BREAKPOINT error.....
오류가 잘 이해되지 않아서 간단하게 테스트를 해봤다.
arr이라는 변수에 빈 2차원 배열을 넣고, [0][0]칸에 값을 집어넣어봤는데 아까와 동일한 오류가 났다.
1차원 배열에서도 동일하게 오류가 발생한다.
이를 통해, 존재하지 않는 칸에는 값을 대입할 수 없다는 것을 파악했다!
값을 추가하기 위해서는 append를 사용해야 할 것 같은데,,, 2차원 배열에 append를 어떻게 활용해야 할지 감이 잡히지 않았다.
🔵 풀이 1 - 배열 초기화 : arr3에 arr1 대입하기
그래서 선택한 방법은, 임의로 칸을 만드는 것이었다!
리턴할 arr3에 arr1을 대입하여 형태가 동일한 어레이로 만들고,
여기에 for 반복문을 활용해 arr2 값을 더해주면 행렬의 합을 구할 수 있다.
func solution(_ arr1:[[Int]], _ arr2:[[Int]]) -> [[Int]] {
var arr3: [[Int]] = arr1
for (i, num) in arr1.enumerated() {
for (j, num) in arr1[i].enumerated() {
arr3[i][j] += arr2[i][j]
}
}
return arr3
}
print(solution([[1,2],[2,3]], [[3,4],[5,6]])) // [[4, 6], [7, 9]]
그리고 성공했다!
➡️ 코드 보완
그런데 이 코드에서 아쉬운 점은 for 구문에서 'num'이 사용되지 않았다는 것이다.
.enumerated()로 인덱스 번호와 인덱스 값을 모두 추출할 필요 없이, 인덱스 번호만 추출하면 되므로,
for i in 0..<arr1.count 로 대체하는 게 좋을 것 같다.
func solution(_ arr1:[[Int]], _ arr2:[[Int]]) -> [[Int]] {
var arr3: [[Int]] = arr1
for i in 0..<arr1.count {
for j in 0..<arr1[i].count {
arr3[i][j] += arr2[i][j]
}
}
return arr3
}
print(solution([[1,2],[2,3]], [[3,4],[5,6]])) // [[4, 6], [7, 9]]
시간 복잡도도 더 작다.
🔵 풀이 2 - 배열 초기화 : Array(repeating:count:) 사용
나중에 찾아보니,
arr1을 대입하는 방법 말고도, arr1과 동일한 구조로 배열을 초기화하는 코드가 있는 것을 알게 되었다.
Array(repeating: Array(repeating: 0, count: arr1[0].count), count: arr1.count)
func solution(_ arr1: [[Int]], _ arr2: [[Int]]) -> [[Int]] {
var arr3: [[Int]] = Array(repeating: Array(repeating: 0, count: arr1[0].count), count: arr1.count)
for i in 0..<arr1.count {
for j in 0..<arr1[i].count {
arr3[i][j] = arr1[i][j] + arr2[i][j]
}
}
return arr3
}
print(solution([[1,2],[2,3]], [[3,4],[5,6]]))
'Swift > Code Kata (알고리즘)' 카테고리의 다른 글
[Swift|코드카타] (프로그래머스) #39. 최대공약수와 최소공배수 (0) | 2024.03.12 |
---|---|
[Swift|코드카타] (프로그래머스) #38. 직사각형 별찍기 - readLine(), components(seperatedBy:) (0) | 2024.03.12 |
[Swift|코드카타] (프로그래머스) #36. 문자열 다루기 기본 (0) | 2024.03.09 |
[Swift|코드카타] (프로그래머스) #34. 문자열 내림차순으로 배치하기 - sorted()는 배열을 반환한다 (0) | 2024.03.07 |
[Swift|코드카타] (프로그래머스) #33. 약수의 개수와 덧셈 - 약수는 제곱근으로! (0) | 2024.03.06 |