1. 문제
2. 문제 해결 논리
- 문제 이해
- 주어진 것
- arr1, arr2 //행과 열의 크기가 같은 임의의 배열
- 요구되는 것
- answer //arr1과 arr2의 각 원소를 더한 배열
- 주어진 것
- 데이터 구조 결정
- 방법 1. 이중 for문 사용
- for문을 사용하기 적합한 상황
- 인덱스에 접근할 필요가 있을 때
- (== 순서에 의존하는 작업을 할 때)
- 요소를 수정하거나 제어해야할 때
- 코드가 길어지면 가독성이 떨어질 수 있음
- 요소를 순회하고 값을 읽는 작업, 특정 순서를 따르는 작업에 좋음
- for문을 사용하기 적합한 상황
- 방법 2. for - each문 사용
- for - each문을 사용하기 적합한 상황
- 인덱스에 접근할 필요가 없을 때
- (== 순서에 의존하지 않는 작업을 할 때)
- 순회 작업이 간단할 때
- 간결하고 가독성이 좋음
- 요소를 순회하고 값을 읽는 작업에 좋음
- for - each문을 사용하기 적합한 상황
- 방법 3. Stream API 사용
- 람다식을 사용하여 매우 간결하나, 가독성과 성능이 떨어질 수 있음
- 방법 1. 이중 for문 사용
- 알고리즘 설계
3-1. 이중 for문 사용
3-2. for - each문 사용
3-3. Stream API 사용
3. 코드 구현
3-1. 이중 for문 사용
class Solution {
public int[][] solution(int[][] arr1, int[][] arr2) {
//arr1의 요소의 개수 == 행의 수
int rows = arr1.length;
//arr1의 요소(배열)의 요소 개수 == 열의 수
int cols = arr1[0].length;
int[][] answer = new int[rows][cols];
//행 조작을 위한 반복문 1
for (int i = 0; i < rows; i++) {
//열 조작을 위한 반복문 2
for (int j = 0; j < cols; j++) {
//배열 arr1, arr2의 각 행과 열에 대한 덧셈
answer[i][j] = arr1[i][j] + arr2[i][j];
}
}
return answer;
}
}
3-2. for - each문 사용
class Solution {
public int[][] solution(int[][] arr1, int[][] arr2) {
//arr1의 요소의 개수 == 행의 수
int rows = arr1.length;
//arr1의 요소(배열)의 요소 개수 == 열의 수
int cols = arr1[0].length;
int[][] answer = new int[rows][cols];
//arr2 배열의 각 행을 접근하기 위한 행 인덱스 생성
int rowIndex = 0;
//arr1 배열의 각 요소(행)에 접근하는 반복문
for (int[] row1 : arr1) {
//arr2 배열의 각 요소(행) 호출
int[] row2 = arr2[rowIndex];
//새로운 행(배열)을 arr1, arr2의 열의 수만큼 생성
int[] newRow = new int[cols];
//row1과 row2의 각 요소(열)에 접근하는 반복문
for (int i = 0; i < cols; i++) {
//row1과 row2의 각 요소(열)의 덧셈
newRow[i] = row1[i] + row2[i];
}
//반환할 배열에 행 입력
answer[rowIndex] = newRow;
//덧셈이 끝난 후 행 인덱스 증가
rowIndex++;
}
return answer;
}
}
3-3. Stream API 사용
import java.util.stream.*;
class Solution {
public int[][] solution(int[][] arr1, int[][] arr2) {
//0부터 arr1.length-1까지 행의 인덱스를 생성하는 IntStream 생성
//(이 Stream은 각 행에 대한 연산을 수행하기 위함)
return IntStream.range(0, arr1.length)
//각 행의 인덱스 i에 대해서
//다시 0부터 arr1[i].length-1까지 열의 인덱스를 생성하는 IntStream 생성
//(이 Stream은 각 열에 대한 연산을 수행하기 위함)
.mapToObj(i -> IntStream.range(0, arr1[i].length)
//각 열의 인덱스 j에 대해서 arr1과 arr2의 덧셈 연산 수행
.map(j -> arr1[i][j] + arr2[i][j])
//각 행에 대한 덧셈 결과를 int[] 배열로 반환
.toArray())
//최종 결과를 int[][] 배열로 반환
.toArray(int[][]::new);
}
}
* Reference
https://school.programmers.co.kr/learn/courses/30/lessons/12950
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
반응형
'PS > Programmers' 카테고리의 다른 글
[level1, Stack/Queue] 같은 숫자는 싫어 (0) | 2023.03.20 |
---|---|
[level1, 유클리드 호제법] 최대공약수와 최소공배수 (0) | 2023.03.19 |
[level1, sort] 문자열 내림차순으로 배치하기 (0) | 2023.03.19 |
[level1, StringBuilder] 수박수박수박수? (0) | 2023.03.18 |
[level1, Map] 신고 결과 받기 (0) | 2023.03.16 |