본문 바로가기
Algorithm/Programmers

[프로그래머스] 행렬 테두리 회전하기 자바

by YOONAYEON 2022. 10. 5.
문제

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

문제 풀이

 

처음에는 행렬이 1부터 순서대로 시작하니까 굳이 행렬을 계속 갱신하지 않고 풀이할 수 있지 않을까 생각했는데 그냥 직접 행렬을 rotation해주는게 답인 것 같아서 로테이션 함수를 따로 만들어주었다.

 

✔️ rotation함수

1. 행렬의 각 꼭짓점 부분을 t1, t2, t3, t4 변수를 이용하여 처음에 보관

2. temp변수를 이용하여 기존의 행렬값 보관

3. before변수를 이용해 temp값을 한 번 더 보관하여 다음 수를 갱신할 수 있도록 함

4. 이 때 flag변수로 반복문의 첫번째 시작을 구분하여 before값을 꼭짓점으로 넣을지, temp로 넣을지 구분

5. 각 반복문마다 min값 갱신

아래 코드에서 사용한 4개의 for문은 사진과 같은 형태로 갱신시켜준 것이다.

 

 

 

소스 코드

 

class Solution {
    
    static int[][] grid;
    
    public int[] solution(int rows, int columns, int[][] queries) {
    	int[] answer = new int[queries.length];
    	int idx = 1;
    	grid = new int[rows][columns];
    	
    	for(int r = 0; r < rows; r++)
    		for(int c = 0; c < columns; c++)
    			grid[r][c] = idx++;
    	
    	idx = 0;
    	for(int i = 0; i < queries.length; i++){
    		answer[idx++] = rotation(queries[i][0]-1, 
                                     queries[i][1]-1, 
                                     queries[i][2]-1, 
                                     queries[i][3]-1);
        }
    	
        return answer;
    }
    
    public static int rotation(int r1, int c1, int r2, int c2) {
    	int min = Integer.MAX_VALUE;
    	int t1 = grid[r1][c1], t2 = grid[r1][c2];
    	int t3 = grid[r2][c1], t4 = grid[r2][c2];
        boolean flag = false;
    	int temp, before;
    	
    	//r1행 이동
    	before = t1;
    	for(int i = c1 + 1; i <= c2; i++) {
    		min = Math.min(min, before);
    		if(flag) {
    			temp = grid[r1][i];
    			grid[r1][i] = before;
    			before = temp;
    		} 
    		else {
    			temp = grid[r1][i];
    			grid[r1][i] = before;
    			before = temp;
    			flag = true;
    		}
    	}
    	
    	//c2열 이동
    	flag = false;
    	before = t2;
    	for(int i = r1 + 1; i <= r2; i++) {
    		min = Math.min(min, before);
    		if(flag) {
    			temp = grid[i][c2];
    			grid[i][c2] = before;
    			before = temp;
    		}else {
    			temp = grid[i][c2];
    			grid[i][c2] = before;
    			before = temp;
    			flag = true;
    		}
    	}

    	//r2행 이동
    	flag = false;
    	before = t4;
    	for(int i = c2 - 1; i >= c1; i--) {
    		min = Math.min(min, before);
    		temp = grid[r2][i];
    		if(flag) {
    			grid[r2][i] = before;
    			before = temp;
    		}else {
    			grid[r2][i] = before;
    			before = temp;
    			flag = true;
    		}
    	}
    	
    	//c1행 이동
    	flag = false;
    	before = t3;
    	for(int i = r2 - 1; i >= r1; i--) {
    		min = Math.min(min, before);
    		temp = grid[i][c1];
    		if(flag) {
    			grid[i][c1] = before;
    			before = temp;
    		}else {
    			grid[i][c1] = before;
    			before = temp;
    			flag = true;
    		}
    	}
    	
    	return min;
    }
}