PS
행렬 회전 [코딩 인터뷰 완전 분석]
깊게 생각하고 최선을 다하자
2022. 7. 24. 02:24
1. 문제에 대한 이해
- 우리가 풀어야 할 문제는 무엇인가?
- 주어진 자료는 무엇인가?
- 조건은 무엇인가?
- 우리가 문제를 풀기 위해 주어진 자료가 충분한가?
- 숨겨진 조건이나 자료가 있는가? 그렇다면 그 것을 다른 방법으로 해석해보라.
- 우리가 풀어야 할 문제는 무엇인가?
-> 이미지를 표현하는 NxN행렬을 회전하라
-> 이미지의 각 픽셀은 4바이트로 표현된다.
-> 행렬을 추가로 사용하지 않고서도 할 수 있겠는가?
->
- 90도로 회전한다는 것이 무엇인가?
-> 왜 90도로 회전하는가?
-> 행렬을 추가하지 않고서 어떻게 하는가?
-> 우선은 행렬을 사용해서 해보자
-> 시계 방향으로 90도 회전한다
(0,0) -> (0,2)
(0,1) -> (1,2)
(0,2) -> (2,2)
(1,0) -> (0,1)
(1,1) -> (1,1)
(1,2) -> (2,1)
111 011
100 101
011 101
- 문제가 무엇인가?
-> 어떻게 행렬 없이 회전시키는 것이 가능한가?
->
2. 계획
- 전에 비슷한 문제를 알고 있는가?
- 이 문제를 푸는데 있어서 유용하게 쓸 수 있는 지식은 무엇인가?
- 비슷한 문제를 풀어본 적이 있다면 그 것을 활용할 수 있는가?
- 만약 문제를 풀 수 없다면 문제를 더 단순하게 하기 위해서 주어진 조건을 버려보아라
- 주어진 자료로부터 유용한 것을 이끌어 낼 수 있는가?
- 자료는 모두 사용했는가?
- 조건을 모두 사용했는가?
- 문제에 포함된 핵심적인 개념은 모두 고려했는가?
- 코드를 어떻게 작성하는가?
-> 코드를 어떻게 작성하는가?
-> 우선은 arr1과 arr2를 만든다
-> arr1에 본 데이터를 입력한다
-> 그 다음에 arr2에 해당 데이터를 자리를 바꾸어서 입력한다
-> i,j인 경우 j, (n-1)-i 로 바꾼다
-> 그 다음에 출력해본다.
3. 실행
- 풀이 계획을 실행하고, 각 단계가 올바른지 점검하라.
import java.util.*;
public class Main {
public void matrixRotate(){
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int[][] arr1 = new int[N][N];
int[][] arr2 = new int[N][N];
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
int num = sc.nextInt();
arr1[i][j] = num;
}
}
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
arr2[j][(N-1)-i] = arr1[i][j];
}
}
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
System.out.print(arr2[i][j]+ " ");
}
System.out.println();
}
}
public void matrixRotateWithoutAdditionalMatrix(){
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int[][] arr = new int[N][N];
ArrayList<Integer> tmp = new ArrayList<>();
int position = 0;
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
int num = sc.nextInt();
arr[i][j] = num;
}
}
for(int j=0; j<N; j++){
for(int i=N-1; i>=0; i--){
tmp.add(arr[i][j]);
}
}
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
arr[i][j] = tmp.get(position++);
}
}
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
public static void main(String args[]) {
Main T = new Main();
T.matrixRotate();
T.matrixRotateWithoutAdditionalMatrix();
}
}
4. 반성
- 문제를 다른 방식으로 해결할 수 있는가?
- 결과나 방법을 어떤 다른 문제에 활용할 수 있는가?
- 어떻게 하면 더 효율적으로 문제를 해결할 수 있는가?
- 어떻게 하면 더 효과적으로 문제를 해결할 수 있는가?
- 어떻게 하면 더 효율적으로 문제를 해결할 수 있는가?
-> 문제를 급하게 풀려는 습관을 고쳐야 한다
-> 문제를 급하게 풀려면 오히려 느려진다. 비효율적이 된다.