행렬 테두리 회전하기

행렬 테두리 회전하기

코딩테스트 연습 - 행렬 테두리 회전하기 | 프로그래머스 (programmers.co.kr)

풀이)

접근)

그림과 같이 영역별로 좌표의 증감을 부여했고, 한 바퀴를 도는 동안 값을 바꾸며 최소값을 저장하는 방식을 이용했다.

알고리즘)

행렬의 값을 모두 채운 뒤 첫 번째 queries값들을 이용하여 (x1, y1 ,x2 ,y2)값을 받아온다.

현재 좌표를 나타내는 x, y와 다음 좌표를 나타내는nextX, nextY에 x1, y1을 대입한다.

조건에 따라 nextX, nextY값을 증감시킨다.

next변수에 matrix(next)값을 저장하고 matrix(next)는 matrix(current)로 대체한다.

current값에 next를 대입하고 각 x, y는 nextX, nextY로 대체한다.

이 때, (nextX == x1 && nextY == y1)의 조건을 만족하면 반복을 중단한다.

(반복)

코드

import java.util.Arrays; import java.util.ArrayList; class Solution { int[][] matrix; int x,y,nextX,nextY; int temp = 0; int min; int current= 0, next =0; ArrayList answer; public void func(int x1, int y1, int x2, int y2) { while(true){ if(x == x1) // 첫 행 { if(y < y2) nextY++; if(y == y2) // x1,y2 nextX++; } else if(x == x2) // 마지막 행 { if(y <= y2 && y > y1) nextY--; if(y == y1) // x2,y1 nextX--; } else // 중간 행 { if(y == y1) // 왼쪽 열 nextX--; if(y == y2) // 오른쪽 열 nextX++; } if( min > current) min = current; next = matrix[nextX][nextY]; matrix[nextX][nextY] = current; current = next; x = nextX; y = nextY; if(nextX == x1 && nextY == y1){ answer.add(min); break; } } } public ArrayList solution(int rows, int columns, int[][] queries) { answer = new ArrayList(); matrix = new int[rows+1][columns+1]; int value = 1; for(int i = 1; i <= rows;i++) { for(int j = 1; j <= columns;j++ ) { matrix[i][j] = value++; //System.out.printf("%d ",matrix[i][j]); } //System.out.println(); } for(int i = 0; i < queries.length;i++) { x = queries[i][0]; y = queries[i][1]; nextX = x; nextY = y; min = 10000000; current = matrix[x][y]; func(queries[i][0],queries[i][1],queries[i][2],queries[i][3]); } //System.out.printf("%d %d %d %d",queries[0][0],queries[0][1],queries[0][2],queries[0][3]); return answer; } }

from http://sy4406.tistory.com/43 by ccl(A) rewrite - 2021-09-20 20:01:38