문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
알고리즘
없음
풀이
문제에서 주어진대로 queries의 수만큼 반복하며 행렬 테두리를 회전하고 그 중 최솟값을 리스트에 추가해 반환한다.
테두리 회전
테두리가 시계 방향으로 회전하기 때문에 앞에서부터 덮어쓰면 전부 같은 값이 된다.
따라서 다음과 같이 4개의 변에 대해 뒤애서부터 덮어쓰기를 진행해야한다.
1. y1, x2 에서 y1, x1 까지
2. y2, x2 에서 y1, x2 까지
3. y2, x1 에서 y2, x2 까지
4. y1, x1 에서 y2, x1 까지
여기서 끝이 아니라 덮어쓰게 되면 3개의 꼭짓점 값이 덮어씌워지게 되고, 결과적으로 꼭짓점 다음 칸의 값에 잘못된 값이 들어간다.
따라서 회전 작업 전에 세 꼭짓점 값을 임시로 저장해두고, 회전이 끝난 후 세 꼭짓점 다음 값에 덮어씌워주어야한다.
코드
import java.util.*;
class Solution {
public ArrayList<Integer> solution(int rows, int columns, int[][] queries) {
int[][] board = new int[rows+1][columns+1];
for(int i=1; i<=rows; i++)
for(int j=1; j<=columns; j++)
board[i][j] = (i-1)*columns + j;
ArrayList<Integer> list = new ArrayList<>();
for(int[] query: queries) {
int y1 = query[0];
int x1 = query[1];
int y2 = query[2];
int x2 = query[3];
int[] tmp = {board[y1][x2], board[y2][x2], board[y2][x1]};
int min = Math.min(board[y1][x2], board[y2][x1]);
min = Math.min(min, board[y2][x2]);
for(int i = x2; i > x1; i--) {
board[y1][i] = board[y1][i - 1];
min = Math.min(min, board[y1][i - 1]);
}
for(int i = y2; i > y1; i--) {
board[i][x2] = board[i - 1][x2];
min = Math.min(min, board[i - 1][x2]);
}
for(int i = x1; i < x2; i++) {
board[y2][i] = board[y2][i + 1];
min = Math.min(min, board[y2][i + 1]);
}
for(int i = y1; i < y2; i++) {
board[i][x1] = board[i + 1][x1];
min = Math.min(min, board[i + 1][x1]);
}
board[y1 + 1][x2] = tmp[0];
board[y2][x2 - 1] = tmp[1];
board[y2 - 1][x1] = tmp[2];
list.add(min);
}
return list;
}
}
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 괄호 회전하기 (Java) (0) | 2022.11.08 |
---|---|
[프로그래머스] 합승 택시 요금 (Java) (0) | 2022.11.08 |
[프로그래머스] 이진 변환 반복하기 (Java) (0) | 2022.11.08 |
[프로그래머스] 쿼드압축 후 개수 세기 (Java) (0) | 2022.11.08 |
[프로그래머스] 튜플 (Java) (0) | 2022.11.07 |