Algorithm/프로그래머스

[프로그래머스] 행렬 테두리 회전하기 (Java)

Carroti 2022. 11. 4. 15:00

 

문제

 

프로그래머스

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

programmers.co.kr

 

알고리즘

없음

 

풀이

테두리를 꼭짓점에 맞춰 네 부분으로 나눠 이동시킨다.

1. (y1, x1 + 1) ~ (y1, x2)

2. (y1 + 1, x2) ~ (y2, x2)

3. (y2, x2) ~ (y2, x1 + 1)

4. (y2, x1) ~ (y1 + 1, x1)

 

이때 첫 꼭짓점을 제외한 각 꼭짓점 다음 3 칸은 덮어씌워지기 때문에 탐색 전에 미리 임시 변수에 값을 저장시켜놓고 탐색이 끝난 후 알맞은 좌표에 대입한다.

탐색하면서 찾은 최솟값을 리스트에 넣고 반환한다.

 

 

코드

import java.util.*;

class Solution {
    public ArrayList<Integer> solution(int rows, int columns, int[][] queries) {
        int[][] board = new int[rows+1][columns+1];
        
        for(int i=1; i<=rows; i++)
            for(int j=1; j<=columns; j++)
                board[i][j] = (i-1)*columns + j;
        
        ArrayList<Integer> list = new ArrayList<>();
        for(int[] query: queries) {
            int y1 = query[0];
            int x1 = query[1];
            int y2 = query[2];
            int x2 = query[3];
            
            int[] tmp = {board[y1][x2], board[y2][x2], board[y2][x1]};
            
            int min = Math.min(board[y1][x2], board[y2][x1]);
            min = Math.min(min, board[y2][x2]);
            
            for(int i = x2; i > x1; i--) {
                board[y1][i] = board[y1][i - 1];
                min = Math.min(min, board[y1][i - 1]);
            }
             
            for(int i = y2; i > y1; i--) {
                board[i][x2] = board[i - 1][x2];
                min = Math.min(min, board[i - 1][x2]);
            }
            
            for(int i = x1; i < x2; i++) {
                board[y2][i] = board[y2][i + 1];
                min = Math.min(min, board[y2][i + 1]);
            }
            
            for(int i = y1; i < y2; i++) {
                board[i][x1] = board[i + 1][x1];
                min = Math.min(min, board[i + 1][x1]);
            }
            
            board[y1 + 1][x2] = tmp[0];
            board[y2][x2 - 1] = tmp[1];
            board[y2 - 1][x1] = tmp[2];
            
            list.add(min);
        }
        
        return list;
    }
}