Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 클린코드
- 11286번
- Adapater Pattern
- Design Patterns
- 1043번
- 11758번
- 2156번
- 자바의 정석
- SerialDate 리펙터링
- java의 정석
- springboot
- 코딩테스트
- programmers
- 백준
- DxTrace
- 1300번
- 9장
- 냄새와 휴리스틱
- 17장
- 10830번
- Design Pattern
- 프로그래머스
- 코딩 테스트
- java
- Spring
- 가장 긴 증가하는 부분 수열2
- 2166번
- 2206번
- BOJ
- Dxerr.h
Archives
- Today
- Total
Don't give up!
[프로그래머스] 행렬 테두리 회전 (java) 본문
코딩테스트 연습 - 행렬 테두리 회전하기 | 프로그래머스 (programmers.co.kr)
어떻게 생각하고 문제를 풀었는가?
행렬에서 테두리를 회전하는 것을 상/하/좌/우 4개의 직선 행렬로 나누어 원소를 한 칸씩 이동시키는 것으로 바꾸어 생각하였습니다.
원소의 이동은 이동할 위치의 원소 값을 따로 저장하고, 해당 위치에 이전 인덱스의 원소를 복사하는 과정을 반복하여 구현할 수 있습니다.
문제에서 주어진 시계방향을 그대로 사용한다면 반복문마다 따로 저장되는 원소의 값을 변경하여야하지만 반시계방향으로 값을 복사한다고 생각한다면 따로 저장해야할 원소는 시작 위치의 원소 뿐으로 메모리 공간을 효율적으로 사용할 수 있습니다.
코드
class Solution {
public int[] solution(int rows, int columns, int[][] queries) {
int[] answer = new int[queries.length];
int[][] numbers = new int[rows][columns];
for(int i=0;i<rows;i++){ //rows == x
for(int j=0;j<columns;j++){ //columns == y
numbers[i][j] = i*columns + j+1;
}
}
for(int k=0; k<queries.length; k++){
int x1 = queries[k][0]-1;
int y1 = queries[k][1]-1;
int x2 = queries[k][2]-1;
int y2 = queries[k][3]-1;
int temp = numbers[x1][y1];
answer[k] = temp;
for(int i=x1;i<x2;i++){//좌측 부분
numbers[i][y1] = numbers[i+1][y1];
if(numbers[i][y1] < answer[k]) answer[k] = numbers[i][y1];
}
for(int i=y1;i<y2;i++){ //하단 부분
numbers[x2][i] = numbers[x2][i+1];
if(numbers[x2][i] < answer[k]) answer[k] = numbers[x2][i];
}
for(int i=x2;i>x1;i--){//우측 부분
numbers[i][y2] = numbers[i-1][y2];
if(numbers[i][y2] < answer[k]) answer[k] = numbers[i][y2];
}
for(int i=y2; i>y1+1; i--){ //상단부분
numbers[x1][i] = numbers[x1][i-1];
if(numbers[x1][i] < answer[k]) answer[k] = numbers[x1][i];
}
numbers[x1][y1+1] = temp;
}
return answer;
}
}
설계를 바탕으로 코드를 작성하였습니다.
코드를 작성할 때 주의해야할 점이 있는데, 문제에서 주어진 x, y는 x행 y열을 의미하기 때문에 Array[x][y]로서 문제를 해결하여야 합니다.
(x, y)의 좌표로서 문제를 바라보신다면 Array[y][x]가 되므로 초기 배열의 값을 넣는 식을 변경해야 할 필요가 있습니다.
'Coding Test > Programmers' 카테고리의 다른 글
[프로그래머스] 메뉴 리뉴얼 (java) (0) | 2021.05.13 |
---|---|
[프로그래머스] 조이스틱 (java) (2) | 2021.05.11 |
[프로그래머스] 멀쩡한 사각형 (java) (0) | 2021.05.09 |