Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- programmers
- useDispatch
- createSlice
- redux
- 프로그래머스
- redux-toolkit
- 항해99
- 리액트
- 테코테코
- react-router
- sw expert academy
- Algorithm
- Get
- Python
- 항해플러스
- 이코테
- axios
- json-server
- react
- 자바
- 알고리즘
- C++
- java
- JavaScript
- SW
- 코딩테스트합격자되기
- react-redux
- 매일메일
- maeil-mail
- redux-saga
Archives
- Today
- Total
Binary Journey
[코딩테스트합격자되기-자바편] 문제05. 행렬의 곱셈 본문
반응형
💡 해당 풀이는 코딩 테스트 합격자되기 - 자바편 에서 발췌된 내용을 바탕으로 작성되었습니다.
문제
출처: 프로그래머스 - 행렬의 곱셈
내용
2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution()
을 완성해주세요.
제약 조건
- 행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하입니다.
- 행렬 arr1, arr2의 원소는 -10 이상 20 이하인 자연수입니다.
- 곱할 수 있는 배열만 주어집니다.
입출력의 예
arr1 | arr2 | return |
---|---|---|
[[1, 4], [3, 2], [4, 1]] | [[3, 3], [3, 3]] | [[15, 15], [15, 15], [15, 15]] |
[[2, 3, 2], [4, 2, 4], [3, 1, 4]] | [[5, 4, 3], [2, 4, 1], [3, 1, 1]] | [[22, 22, 11], [36, 28, 18], [29, 20, 14]] |
기록하기
💡 어디까지 생각해봤는지 단계적으로 기록해봅니다.
- 행렬의 곱셈을 구현하자
풀이
풀이 시간
시작 시각 | 종료 시각 | 총 소요 시간 |
---|---|---|
20:52 | 21:10 | 22분 |
문제 분석
제약 사항 파악 & 테스트 케이스 작성
- 행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하
- 행렬 arr1, arr2의 원소는 -10 이상 20 이하인 자연수
- 곱할 수 있는 배열만 주어집니다.
입력값 분석
💡 입력값을 분석하면 문제에서 요구하는 알고리즘의 시간 복잡도를 간접적으로 파악할 수 있습니다.
arr1 | arr2 | return |
---|---|---|
[[1, 4], [3, 2], [4, 1]] | [[3, 3], [3, 3]] | [[15, 15], [15, 15], [15, 15]] |
[[2, 3, 2], [4, 2, 4], [3, 1, 4]] | [[5, 4, 3], [2, 4, 1], [3, 1, 1]] | [[22, 22, 11], [36, 28, 18], [29, 20, 14]] |
의사 코드 작성
💡 의사 코드는 동작 중심으로 작성하는 것이 중요합니다.
💡 의사 코드는 문제 해결 순서로 작성합니다.
💡 의사 코드를 충분히 테스트해봅니다.
int[][] solution(int[][] 행렬1, int[][] 행렬2) {
for (행렬1) {
// 행렬1의 n번째 행
for (행렬2) {
// 행렬1의 n번째 행의 열과 행렬2의 m번째 행의 열을 곱한다.
}
}
}
구현
class Solution {
public int[][] solution(int[][] arr1, int[][] arr2) {
int[][] result = new int[arr1.length][arr2[0].length];
for (int i = 0; i < arr1.length; i++) {
for (int j = 0; j < arr2[0].length; j++) {
for (int k = 0; k < arr2.length; k++) {
result[i][j] += arr1[i][k] * arr2[k][j];
}
}
}
return result;
}
}
복기하기
답안과 나의 풀이를 비교해보세요
class Solution {
public int[][] solution(int[][] arr1, int[][] arr2) {
// 1. 행렬 arr1과 arr2의 행과 ㅕㄹ의 수
int r1 = arr1.length;
int c1 = arr1[0].length;
int r2 = arr2.length;
int c2 = arr2[0].length;
// 결과를 저장할 2차원 배열 초기화
int[][] answer = new int[r1][c2];
for (int i = 0; i < r1; i++) {
for (int j = 0; j < c2; j++) {
// 두 행렬의ㅣ 데이터를 곱해 결과 리스트에 더함
for (int k = 0; k < c1; k++) {
answer[i][j] += arr1[i][k] * arr2[k][j];
}
}
}
return answer;
}
}
요약하기
- 최종 시간 복잡도는 O(N^3)
반응형
'Algorithm > 코딩테스트합격자되기-자바편' 카테고리의 다른 글
[코딩테스트합격자되기-자바편] 문제07. 방문길이 (0) | 2025.01.02 |
---|---|
[코딩테스트합격자되기-자바편] 문제06. 실패율 (2) | 2024.12.26 |
[코딩테스트합격자되기-자바편] 문제04. 모의고사 (1) | 2024.12.26 |
[코딩테스트합격자되기-자바편] 문제03. 두 개 뽑아서 더하기 (0) | 2024.12.26 |
[코딩테스트합격자되기-자바편] 문제02. 배열 제어하기 (1) | 2024.12.26 |