2740번

2023. 1. 11. 09:41·CS 이론/알고리즘
728x90

https://www.acmicpc.net/problem/2740

 

2740번: 행렬 곱셈

첫째 줄에 행렬 A의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 순서대로 주어진다. 그 다음 줄에는 행렬 B의 크기 M과 K가 주어진다. 이어서 M개의 줄에 행렬 B의 원소 K개

www.acmicpc.net

이 문제는 단순한 행렬곱 계산 방식으로 문제를 해결 할 수 있다.

나는 이 문제를 while문을 사용해서 풀었는데, for문으로 하기에는 3중 for문을 써야할 것 같아서 였다.

그래서 while문에 for문을 추가하여 변수2개를 주어 문제를 해결했다.

 

계산 방법은 간단하다 각행과 열을 곱하는 것인데, 예를 들어 3 by 2 행렬과 2 by 3행렬이 있을 때,

행렬 곱은 a11*b11+a12*b21, a11*b12+a12*b22, a11*b13+a12*b23

a21*b11+a22*b21, a21*b12+a22*b22, a21*b13+a22*b23

a31*b11+a32*b21,a31*b12+a32*b22, a31*b13+a32*b23로 나타낼 수 있다.

 

즉, 첫번째 row에 대해 각 column들의 곱의 합을 구하는 것이다.

그럼 만들려고 하는 정답 행렬을 total이라고 했을 때, matrix[row][i]+matrix2[i][column]들의 합을 구한 tmp가 total[row][column]의 값이 되는 것이다.

선형대수를 배웠다면 행렬의 곱은 이해하기 쉬울것이다.

아래의 코드는 행렬의 곱을 이용해서 나타낸 것이다. 하지만 이 문제는 분할 정복을 구현하도록 의도한 문제이다.

package backjoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class b2740 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        int[][] matrix = new int[N][M];
        for(int i=0; i<N; i++){
            st=new StringTokenizer(br.readLine());
            for(int j=0; j<M; j++){
                matrix[i][j]= Integer.parseInt(st.nextToken());
            }
        }//N by M matrix
        st = new StringTokenizer(br.readLine());
        int M1 = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());
        int[][] matrix2 = new int[M1][K];
        for(int i=0; i<M1; i++){
            st=new StringTokenizer(br.readLine());
            for(int j=0; j<K; j++){
                matrix2[i][j]= Integer.parseInt(st.nextToken());
            }
        }// M by K matrix
        int[][] total = new int[N][K];
        int row = 0;
        int column=0;
        while (row<N){
            int tmp=0;
            for(int i=0; i<M; i++) {
                tmp += matrix[row][i] * matrix2[i][column];
            }
            total[row][column]=tmp;
            column++;
            if(column==K){
                row++;
                column=0;
            }
        }//matrix multiple
        StringBuilder sb = new StringBuilder();
        for(int[] i: total){
            for(int j : i){
                sb.append(j).append(" ");
            }
            sb.append("\n");
        }
        System.out.println(sb);
    }
}

그래서 분할 정복으로 푸는 방법을 찾아 보던 중에 스트라센 알고리즘을 알았다.

스트라센 알고리즘에 관한 내용은 아래의 블로그 작성자 분께서 엄청 잘 설명하셔서 이 글을 보면 이해가 잘 될 것이라고 생각한다.

 

https://st-lab.tistory.com/245

 

[백준] 2740번 : 행렬 곱셈 - JAVA [자바]

www.acmicpc.net/problem/2740 2740번: 행렬 곱셈 첫째 줄에 행렬 A의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 순서대로 주어진다. 그 다음 줄에는 행렬 B의 크기 M과 K가 주어진

st-lab.tistory.com

 

728x90

'CS 이론 > 알고리즘' 카테고리의 다른 글

11279번  (0) 2023.01.14
1920번  (0) 2023.01.13
2630번  (0) 2023.01.10
11047번  (1) 2023.01.07
1018번  (0) 2023.01.06
'CS 이론/알고리즘' 카테고리의 다른 글
  • 11279번
  • 1920번
  • 2630번
  • 11047번
Bello's
Bello's
개발하는 벨로
  • Bello's
    벨로의 개발일지
    Bello's
  • 전체
    오늘
    어제
    • 분류 전체보기 (199) N
      • 노예 일지 (7)
        • 스타트업 노예일지 (3)
      • CS 이론 (81)
        • 학과 수업 (4)
        • 알고리즘 (64)
        • 시스템 프로그래밍 (3)
        • 데이터 통신 (1)
        • 운영체제 (2)
        • 데이터베이스 (1)
      • project (3)
      • 나는 감자다. (4)
      • Spring (27)
      • 모각코 (45)
        • 절개와지조(모각코) (7)
        • 어쩌다보니 박준태가 조장이조 (11)
        • 어쩌다보니 박준태가 또 조장이조 (12)
      • LikeLion🦁 (20)
      • 캘리포니아 감자 (4)
      • OpenSource Contribute (1)
      • 우아한테크벨로 (1) N
        • 프리코스 회고록 (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    타임리프
    DFS
    프리코스
    모각코
    뛰슈
    JPA
    Spring
    나는 감자
    오블완
    감자
    티스토리챌린지
    절개와지조
    백준
    어렵다
    그래프 순회
    누적합
    8기
    BFS
    자바
    회고록
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
Bello's
2740번
상단으로

티스토리툴바