행렬의 덧셈
💡
문제 설명
행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.
제한 조건
- 행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않습니다.
입출력 예
arr1 arr2 return
[[1,2],[2,3]] | [[3,4],[5,6]] | [[4,6],[7,9]] |
[[1],[2]] | [[3],[4]] | [[4],[6]] |
내코드
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 k=0; k<arr1[i].length;k++){
answer[i][k] = arr1[i][k]+arr2[i][k];
}
}
return answer;
}
}
여기서 나는 더 줄일것이 없다고 생각했는데.
다른코드1
class Solution {
public int[][] solution(int[][] arr1, int[][] arr2) {
int[][] answer = arr1;
for(int i=0; i<answer.length;i++){
for(int k=0; k<answer[i].length;k++){
answer[i][k] += arr2[i][k];
}
}
return answer;
}
}
이런식으로 answer를 arr1으로 지정하고
answer[i][k]에 += arr2[i][k] 하는식으로 코드를 줄일수있었다.
- 위 코드를 사용하면 새로운 객체를 사용하는것이 아닌 기존의 다중배열 arr1을 참조하는것이기 때문에 공간복잡도를 줄일 수 있다.
- 공간복잡도를 줄이면 메모리를 절약할 수 있다.
- 하지만 arr1의 원본 데이터를 수정하므로 ‘캡슐화’ 원칙을 어기게 된다.
성능상 효율차이는 거의 없을것같지만 코드가 더욱 간결해졌다는 점이 눈에 띈다.
직사각형 별찍기
💡
문제 설명
이 문제에는 표준 입력으로 두 개의 정수 n과 m이 주어집니다.
별(*) 문자를 이용해 가로의 길이가 n, 세로의 길이가 m인 직사각형 형태를 출력해보세요.
제한 조건
- n과 m은 각각 1000 이하인 자연수입니다.
예시
입력
5 3
출력
- `****
*****`
나의코드
import java.util.Scanner;
class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
for(int i = 0; i<b;i++){
for(int j =0; j<a;j++){
System.out.print("*");
}
System.out.println("");
}
}
}
- Scanner sc = new Scanner(System.in); 는 콘솔입력(System.in)을 파라미터로 갖는 Scanner 객체를 생성한다.
- nextInt()는 입력값을 공백으로 구분된 토큰으로 처리한다. “5 4” 는 5와 4로, “54”는 54로 처리한다.
다른코드1
StringBuilder,IntStream 사용
import java.util.Scanner;
import java.util.stream.IntStream;
public class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
StringBuilder sb = new StringBuilder();
IntStream.range(0, a).forEach(s -> sb.append("*"));
IntStream.range(0, b).forEach(s -> System.out.println(sb.toString()));
}
}
- IntStream은 Int 전용 Stream객체이다. IntStream 외에도 LongStream,DoubleStream이 존재한다.
- IntStream에서는 range또는 rangeClosed 메소드를 통해 정수범위를 지정할 수 있다. 또한 sum , average, max, min 과 같은 집계 함수가 가능하다.
- 0부터 a-1 까지 StringBuilder에 *을 추가하고, 0부터 b까지 StringBuilder에 쌓아둔 *을 b만큼 println으로 반복한다.
다른코드2
Stream 사용
import java.util.Scanner;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
String stars = IntStream.range(0, a).mapToObj(i -> "*").collect(Collectors.joining());
IntStream.range(0, b).forEach(i -> System.out.println(stars));
}
}
- mapToObj(i→””).collect(Collectors.joining()) : 0부터a-1까지 요소 i를 “”로 치환하고 하나로 합친다.
- 이후 b만큼 반복하여 합친”*”를 출력한다.
오늘의 학습 :
- 공간복잡도를 줄이면 메모리를 절약할 수 있다.
- 캡슐화 : 객체의 상태를 외부에서 직접 변경할 수 없도록 보호하는 것
- Scanner sc = new Scanner(System.in); 는 콘솔입력(System.in)을 파라미터로 갖는 Scanner 객체를 생성한다.
- nextInt()는 입력값을 공백으로 구분된 토큰으로 처리한다. “5 4” 는 5와 4로, “54”는 54로 처리한다.
- IntStream은 Int 전용 Stream객체이다. IntStream 외에도 LongStream,DoubleStream이 존재한다.
- IntStream에서는 range()또는 rangeClosed() 메소드를 통해 정수범위를 지정할 수 있다. 또한 sum() , average(), max(), min() 과 같은 집계 함수가 가능하다.
- mapToObj()는 원시타입(int 등)을 참조형 스트림(Integer 등 )으로 변환할때 유용하다.