프로그래머스 2레벨 77485 행렬 테두리 회전하기 JAVA

문제

링크 : https://programmers.co.kr/learn/courses/30/lessons/77485

rows x columns 크기인 행렬이 있습니다. 행렬에는 1부터 rows x columns까지의 숫자가 한 줄씩 순서대로 적혀있습니다. 이 행렬에서 직사각형 모양의 범위를 여러 번 선택해, 테두리 부분에 있는 숫자들을 시계방향으로 회전시키려 합니다. 각 회전은 (x1, y1, x2, y2)인 정수 4개로 표현하며, 그 의미는 다음과 같습니다.

  • x1 행 y1 열부터 x2 행 y2 열까지의 영역에 해당하는 직사각형에서 테두리에 있는 숫자들을 한 칸씩 시계방향으로 회전합니다.

다음은 6 x 6 크기 행렬의 예시입니다.

grid_example.png

이 행렬에 (2, 2, 5, 4) 회전을 적용하면, 아래 그림과 같이 2행 2열부터 5행 4열까지 영역의 테두리가 시계방향으로 회전합니다. 이때, 중앙의 15와 21이 있는 영역은 회전하지 않는 것을 주의하세요.

rotation_example.png

행렬의 세로 길이(행 개수) rows, 가로 길이(열 개수) columns, 그리고 회전들의 목록 queries가 주어질 때, 각 회전들을 배열에 적용한 뒤, 그 회전에 의해 위치가 바뀐 숫자들 중 가장 작은 숫자들을 순서대로 배열에 담아 return 하도록 solution 함수를 완성해주세요.

풀이

구현력 문제임 시키는대로 하면 됨 라고할뻔 ㅎㅎ;

이차원배열을 조금 다뤄야하는 문제임 각 방향으로 값을 밀어야하는데

중요한 것은 시작에 있는 값을 저장할 것인지 마지막에 있는 값을 저장할 것인지 선택해서

저장한 뒤에 맨 마지막에 저장한 값으로 백업해주어야함 이게 무슨말이냐면

변수 두개의 값을 바꿀려면 tmp변수가 필요하듯이 위 문제에서도 밀리는 부분에 대한 임시 저장을 해주어야한다는 말임

너무 당연한거 아닌가 싶을 수 있는데 당연한거 맞고 뭔가라도 써야할 것 같아서 ㅎㅎ; ✍

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
class Solution {
static int[][] getInput(int rows,int columns)
{
int count = 1;
int arr[][] = new int[rows+1][columns+1];
for(int i=1;i<=rows;i++)
{
for(int j=1;j<=columns;j++)
{
arr[i][j] = count++;
}
}
return arr;
}

public int[] solution(int rows, int columns, int[][] queries) {
int[] answer = new int[queries.length];
int startRow,startCal,endRow,endCal;
int arr[][] = getInput(rows,columns);

for(int i=0;i<queries.length;i++)
{
startRow = queries[i][0];
startCal = queries[i][1];
endRow = queries[i][2];
endCal = queries[i][3];
//오른쪽으로
int curCal,curRow = 0;
int tmp = 0;
int prev = arr[startRow][startCal];
int min = 987654321;
for(curCal = startCal; curCal<=endCal-1;curCal++)
{
min = Math.min(min,prev);
tmp = arr[startRow][curCal+1];
arr[startRow][curCal+1] = prev;
prev = tmp;
}

//시작 row에서 맨 마지막칸 이전값 저장됨

for(curRow = startRow; curRow<=endRow-1;curRow++)
{
min = Math.min(min,prev);
tmp = arr[curRow+1][curCal];
arr[curRow+1][curCal] = prev;
prev = tmp;
}

for(;curCal>=startCal+1;curCal--)
{
min = Math.min(min,prev);
tmp = arr[curRow][curCal-1];
arr[curRow][curCal-1] = prev;
prev = tmp;
}

for(;curRow>=startRow+1;curRow--)
{
min = Math.min(min,prev);
tmp = arr[curRow-1][curCal];
arr[curRow-1][curCal] = prev;
prev = tmp;
}

answer[i] = min;
}
return answer;
}
}

메모

스스로 풀었는가 : ✅

프로그래머스 2레벨 77485 행렬 테두리 회전하기 JAVA

https://praisebak.github.io/2021/07/15/2021-07/p77485/

Author

Praisebak

Posted on

2021-07-15

Updated on

2021-07-15

Licensed under

Comments