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 | 29 | 30 | 31 |
Tags
- 세마포어란?
- 플로이드 와샬
- 서버 호스팅
- 최단 경로
- 프록시
- 플로이드 워셜
- 삼성 청년 SW 아카데미
- 다익스트라 알고리즘
- 호스팅이란?
- 뮤텍스란?
- 뮤텍스
- 세마포어
- 클라우드 서버
- 호스팅
- floyd-warshall
- 동기화
- 세마포어와 뮤텍스
- 프록시서버
- 다익스트라
- 싸피 면접 후기
- Proxy
- 웹 호스팅
- 싸피 합격
- Proxy Server
- Dijkstra Algorithm
- 세마포어와 뮤텍스의 차이
- SSAFY
- 싸피
- Synchronization
Archives
- Today
- Total
어제의 나보다 성장한 오늘의 나
[백준][BOJ-10830][자바] 행렬 제곱 본문
import java.io.*;
import java.util.*;
public class Main {
static HashMap<Long, int[][]> hm = new HashMap<>();
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());
long B = Long.parseLong(st.nextToken());
int[][] matrix = new int[N][N];
for(int i=0; i<N; i++) {
st = new StringTokenizer(br.readLine());
for(int j=0; j<N; j++) {
matrix[i][j] = Integer.parseInt(st.nextToken());
}
}
// 처음부터 1000이 넘게 들어오는 경우
matrix = matrixMod(matrix);
// A^1 과 A^2 저장
hm.put((long) 1, matrix);
multiplyMatrix(matrix, matrix,2);
divideConquer(B);
int[][] result = hm.get(B);
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
System.out.print(result[i][j]+" ");
}
System.out.println();
}
}
public static void divideConquer(long cnt){
if(hm.containsKey(cnt)) return;
long first = 0;
long second = cnt/2;
if(cnt %2 == 0) first = cnt/2;
else first = (cnt/2)+1;
divideConquer(first);
divideConquer(second);
multiplyMatrix(hm.get(first), hm.get(second), cnt);
}
public static int[][] multiplyMatrix(int[][] a, int[][] b, long cnt){
int[][] temp = new int[a.length][a.length];
for(int i=0; i<a.length;i++){
for(int j=0; j<b[0].length;j++){
for(int k=0; k<a[0].length;k++){
temp[i][j] += a[i][k]*b[k][j];
}
}
}
temp = matrixMod(temp);
hm.put(cnt, temp);
return temp;
}
public static int[][] matrixMod(int[][] matrix){
for(int i=0; i<matrix.length; i++) {
for(int j=0; j<matrix[0].length; j++) {
matrix[i][j] %= 1000;
}
}
return matrix;
}
}
정리
- 처음부터 행렬A에 1000이 넘는 값이 들어올 수 있어서 처리를 해줘야 한다. ( 80프로에서 틀린다... )
- A^1과 A^2에 대한 값을 HashMap에 저장한다.
- 재귀를 통해 HashMap에 값이 있다면 더 이상 분할하지 않는다.
- multiplyMatrix()를 통해 곱하고 HashMap에 저장한다.
- 곱이 일어나는 매 순간마다 %1000을 해줘야한다.
'알고리즘 > 백준(BOJ)' 카테고리의 다른 글
[백준][BOJ-10026][자바] 적록색약 (0) | 2021.04.07 |
---|---|
[백준][BOJ-9935][자바] 문자열 폭발 (0) | 2021.04.06 |
[백준][BOJ-1655][자바] 가운데로 말해요 (0) | 2021.04.05 |
[백준][BOJ-1715][자바] 카드 정렬하기 (0) | 2021.04.05 |
[백준][BOJ-14567][자바] 선수과목 (0) | 2021.04.04 |
Comments