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

Benjamin·2023년 5월 5일

프로그래머스

목록 보기
51/67

💁‍♀️ 시뮬레이션, 구현


Troubleshooting

class Solution {
    static int min;
    public int[] solution(int rows, int columns, int[][] queries) {
        int[] answer = new int[queries.length];
        int[][] number = new int[rows][columns];
        int num = 1;
        int answerIndex = 0;
        int[][] direction = {{1,0}, {0,1}, {-1,0}, {0,-1}};
        for(int i =0; i<rows; i++) {
            for(int j=0; j<columns; j++) {
                number[i][j] = num++;
            }
        }
        for(int i=0; i<queries.length; i++) {
            int sRow = queries[i][0]-1;
            int sColumn = queries[i][1]-1;
            int eRow = queries[i][2]-1;
            int eColumn = queries[i][3]-1;
            
            int min = number[sRow][sColumn];
            
            int totalRow  = eRow-sRow;
            int totalColumn = eColumn - sColumn;
            int[] movecnt = {totalRow,totalColumn,totalRow,totalColumn-1};
            
            for(int j=0; j<direction.length; j++) {
                int moves = movecnt[j];
                int[] direc = direction[j];
                
                for(int k =0; k<moves; k++) {
                    int nextRow = sRow + direc[0];
                    int nextColumn = sColumn + direc[1];
                    swap(number,sRow, sColumn,nextRow, nextColumn);
                    sRow = nextRow;
                    sColumn = nextColumn;
                    min = getMin(min, number[nextRow][nextColumn]);
                }
            }
            answer[answerIndex++] = min;
        }
        return answer;
    }
    
    public void swap(int[][] number,int sRow, int sColumn, int nextRow, int nextColumn) {
        int temp=number[sRow][sColumn];
        number[sRow][sColumn] = number[nextRow][nextColumn];
        number[nextRow][nextColumn]= temp;
    }
    
    public int getMin(int a, int b) {
        return Math.min(a,b);
    }
}

문제

원인

최솟값을 찾는것과 swap연산의 순서가 바뀌었어야했다.
swap을 먼저 수행해놓고, 최솟값을 찾을 때 number[nextRow][nextColumn]을 파라미터로 넣어서 비교하고있었으니 비교 데이터가 정확히 안들어가는게 문제였다.

해결

선후관계를 변경했다.
최솟값 먼저 찾은 후 swap연산 수행

min = getMin(min, number[nextRow][nextColumn]); // 순서 중요! 선
swap(number,sRow, sColumn,nextRow, nextColumn); //후

제출코드

class Solution {
    static int min;
    public int[] solution(int rows, int columns, int[][] queries) {
        int[] answer = new int[queries.length];
        int[][] number = new int[rows][columns];
        int num = 1;
        int answerIndex = 0;
        int[][] direction = {{1,0}, {0,1}, {-1,0}, {0,-1}};
        for(int i =0; i<rows; i++) {
            for(int j=0; j<columns; j++) {
                number[i][j] = num++;
            }
        }
        for(int i=0; i<queries.length; i++) {
            int sRow = queries[i][0]-1;
            int sColumn = queries[i][1]-1;
            int eRow = queries[i][2]-1;
            int eColumn = queries[i][3]-1;
            
            int min = number[sRow][sColumn];
            
            int totalRow  = eRow-sRow;
            int totalColumn = eColumn - sColumn;
            int[] movecnt = {totalRow,totalColumn,totalRow,totalColumn-1};
            
            for(int j=0; j<direction.length; j++) {
                int moves = movecnt[j];
                int[] direc = direction[j];
                
                for(int k =0; k<moves; k++) {
                    int nextRow = sRow + direc[0];
                    int nextColumn = sColumn + direc[1];
                    min = getMin(min, number[nextRow][nextColumn]); // 순서 중요! 선
                    swap(number,sRow, sColumn,nextRow, nextColumn); //후
                    sRow = nextRow;
                    sColumn = nextColumn;
                }
            }
            answer[answerIndex++] = min;
        }
        return answer;
    }
    
    public void swap(int[][] number,int sRow, int sColumn, int nextRow, int nextColumn) {
        int temp=number[sRow][sColumn];
        number[sRow][sColumn] = number[nextRow][nextColumn];
        number[nextRow][nextColumn]= temp;
    }
    
    public int getMin(int a, int b) {
        return Math.min(a,b);
    }
}

0개의 댓글