728x90
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/77485
※ 문제 접근방법
(1) 2차원 배열 1부터 rows * cols까지 값 완성하기
(2) 쿼리별 위치값 초기화. (2,2) -> (1,1)
(3) 행과 열의 차이값 구하기
(4) Queue 선언하기
(5) Queue에 시작 위치값 넣기
(6) Queue값을 뽑아서 다음 위치값을 넣고, 다음 위치에 뽑은 값 넣기
(7) row 혹은 col 카운트 올리기
(8) 방향체크
(9) while문 종료 시 최소값 넣기
package matrixOutlineRotate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
public class MatrixOutlineRotate {
public static void main(String[] args) {
Solution s = new Solution();
int r1 = 6, c1 = 6;
int[][] q1 = {{2,2,5,4},{3,3,6,6},{5,1,6,3}};
System.out.println(Arrays.toString(s.solution(r1, c1, q1)));
int r2 = 3, c2 = 3;
int[][] q2 = {{1,1,2,2},{1,2,2,3},{2,1,3,2},{2,2,3,3}};
Solution s2 = new Solution();
System.out.println(Arrays.toString(s2.solution(r2, c2, q2)));
int r3 = 100, c3 = 97;
int[][] q3 = {{1,1,100,97}};
Solution s3 = new Solution();
System.out.println(Arrays.toString(s3.solution(r3, c3, q3)));
}
}
class Solution {
int dirIdx = 0;
int col = 0;
int row = 0;
public int[] solution(int rows, int columns, int[][] queries) {
int[][] arr = new int[rows][columns];
int num = 1;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
arr[i][j] = num++;
}
}
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < queries.length; i++) {
int sRow = queries[i][0] - 1;
int sCol = queries[i][1] - 1;
int eRow = queries[i][2] - 1;
int eCol = queries[i][3] - 1;
int diffRow = eRow - sRow;
int diffCol = eCol - sCol;
int rowCnt = 0;
int colCnt = 0;
int cirCnt = 0;
Queue<Integer> q = new LinkedList<Integer>();
q.add(arr[sRow][sCol]);
int min = Integer.MAX_VALUE;
int row = sRow, col = sCol;
while(!q.isEmpty()) {
if(cirCnt != 0 && row == sRow && col == sCol) {
break;
}
int temp = q.poll();
min = Math.min(min, temp);
if(dirIdx == 0) {
q.add(arr[row][col + 1]);
arr[row][col + 1] = temp;
col++;
} else if(dirIdx == 1) {
q.add(arr[row + 1][col]);
arr[row + 1][col] = temp;
row++;
} else if(dirIdx == 2) {
q.add(arr[row][col-1]);
arr[row][col - 1] = temp;
col--;
} else if(dirIdx == 3) {
q.add(arr[row - 1][col]);
arr[row - 1][col] = temp;
row--;
}
if(dirIdx == 0 || dirIdx == 2) {
colCnt++;
} else if(dirIdx == 1 || dirIdx == 3) {
rowCnt++;
}
if(colCnt == diffCol || rowCnt == diffRow) {
dirIdx = changeDir();
colCnt = 0;
rowCnt = 0;
}
cirCnt++;
}
list.add(min);
}
return list.stream().mapToInt(i->i).toArray();
}
public int changeDir() {
return (dirIdx + 1) % 4;
}
}
728x90
반응형
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스/java] JadenCase 문자열 만들기 (0) | 2022.09.10 |
---|---|
[프로그래머스/java] 거리두기 확인하기 - 카카오 기출 (0) | 2022.08.28 |
[프로그래머스/java] 피로도 (0) | 2022.08.11 |
[프로그래머스/Oracle] 우유와 요거트가 담긴 장바구니 (0) | 2022.08.07 |
[프로그래머스/java] 방금그곡 - 2018 KAKAO BLIND RECRUITMENT (0) | 2022.04.05 |
댓글