행렬의 덧셈

💡

문제 설명

행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 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 등 )으로 변환할때 유용하다.

'프로그래머스 > 자바 코딩테스트' 카테고리의 다른 글

23-06-24  (0) 2023.06.24
23-06-22  (0) 2023.06.22
23-06-18  (0) 2023.06.18
23-06-17  (0) 2023.06.17
23-06-16  (0) 2023.06.16

+ Recent posts