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. 반성

  • 문제를 다른 방식으로 해결할 수 있는가?
  • 결과나 방법을 어떤 다른 문제에 활용할 수 있는가?
  • 어떻게 하면 더 효율적으로 문제를 해결할 수 있는가?
  • 어떻게 하면 더 효과적으로 문제를 해결할 수 있는가?

- 어떻게 하면 더 효율적으로 문제를 해결할 수 있는가?

-> 문제를 급하게 풀려는 습관을 고쳐야 한다

-> 문제를 급하게 풀려면 오히려 느려진다. 비효율적이 된다.