Search
Duplicate
📒

[Programmers] 09-4. 행렬 테두리 회전하기

상태
완료
수업
Algorithm Solving
주제
Programmers
4 more properties
참고

문제해설

NOTE
배열을 회전한 구간의 최소값을 구하라.

문제 로직고민

NOTE
가장 단순하게 배열을 회전시키고, 회전시킨 요소들중 최소값을 반환하는 함수를 작성했다.
배열 회전의 경우 for문을 복잡하게 작성했는데 이를 최적화하는 요소를 재귀로 풀려다 시간문제로 그만뒀다.

작성코드

NOTE
import java.util.*; class Solution { int[][] map; int rows; int columns; public int[] solution(int rows, int columns, int[][] queries) { this.map = new int[rows+1][columns+1]; this.rows = rows; this.columns = columns; // 1. map 초기화 int val = 1; for(int i =1; i<=rows; i++){ for(int j=1; j<=columns; j++){ map[i][j] = val++; } } // 2. 쿼리값 회전 int[] answer = new int[queries.length]; int idx = 0; for(int[] query : queries){ answer[idx++] = rotate(query[0], query[1], query[2], query[3]); } return answer; } private int rotate(int sy, int sx, int dy, int dx){ int min = Integer.MAX_VALUE; int prev = map[sy+1][sx]; int current = 0; // 2. 오른쪽 방향 for(int i=sx; i<=dx; i++){ current = map[sy][i]; map[sy][i] = prev; prev = current; min = Math.min(min, prev); } // 3. 아래 방향 for(int i=sy+1; i<=dy; i++){ current = map[i][dx]; map[i][dx] = prev; prev = current; min = Math.min(min, prev); } // 4. 왼쪽 방향 for(int i=dx-1; i>=sx; i--){ current = map[dy][i]; map[dy][i] = prev; prev = current; min = Math.min(min, prev); } // 5. 위 방향 체크 for(int i=dy-1; i>sy; i--){ current = map[i][sx]; map[i][sx] = prev; prev = current; min = Math.min(min, prev); } return min; } }
Java
복사

다른사람 풀이

NOTE
class Solution { static int map[][]; public int[] solution(int rows, int columns, int[][] queries) { int[] answer = new int[queries.length]; map=new int[rows+1][columns+1]; int idx=1; for(int i=1; i<=rows; i++){ for(int j=1; j<=columns; j++){ map[i][j]=idx++; } } for(int i=0; i<queries.length; i++){ answer[i]=rotate(queries[i][0],queries[i][1],queries[i][2],queries[i][3]); } return answer; }static int rotate(int x1,int y1,int x2,int y2){ int x=x1; int y=y1; int[]dx={0,-1,0,1}; int[]dy={1,0,-1,0}; int dir=3; int temp=map[x][y]; int min=temp; while(true){ if(x==x2&&y==y1){ dir=0; } if(x==x2&&y==y2)dir=1; if(x==x1&&y==y2)dir=2; map[x][y]=map[x+dx[dir]][y+dy[dir]]; x+=dx[dir]; y+=dy[dir]; min=Math.min(map[x][y],min); if(x==x1&&y==y1){ map[x1][y1+1]=temp; break; } } return min; } }
Java
복사
dir이라는 변수를 통해 상하좌우 이동을 단순히 while문 하나로 표현한게 인상깊다.