되면한다
프로그래머스. 행렬 테두리 회전하기 (구현) 본문
https://school.programmers.co.kr/learn/courses/30/lessons/77485
왼쪽위, 오른쪽아래 좌표가 들어온다. 이를 테두리로 하여, 행렬을 시계 방향으로 돌린다.
인덱스값을 잘 지정해야하는 구현 문제이다. 특별한 알고리즘, 자료구조는 필요하지 않다.
1. 특징
1) 인덱스 관련 구현
2. 삽질 포인트
1) 회전 과정에서 이미 값을 덮어버린 좌표값이 새로운 좌표값의 값으로 들어가게 설정하는 등의 실수들이 있어서 시간이 오래걸렸다.
대입할 좌표는 그대로 두고, 가져올 좌표값을 i나 j로 변경한다.
(ex. board[curx][j] = board[curx][j-1];)
3. 코드
#include <string>
#include <vector>
#include <iostream>
#include <limits.h>
using namespace std;
int board[102][102];
vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
vector<int> answer;
int cnt = 1;
for(int i = 1; i < rows + 1; i++)
{
for(int j = 1; j < columns + 1; j++)
{
board[i][j] = cnt++;
}
}
for(int k = 0; k < queries.size(); k++)
{
int curx = queries[k][0];
int cury = queries[k][1];
int curx1 = queries[k][2];
int cury1 = queries[k][3];
int tmp1 = board[curx][cury1];
int tmp2 = board[curx1][cury];
for(int j = cury1; j > cury; j--)
{
board[curx][j] = board[curx][j-1];
}
for(int j = cury; j < cury1; j++)
{
board[curx1][j] = board[curx1][j+1];
}
for(int i = curx; i < curx1; i++)
{
if(i == curx1 - 1) board[i][cury] = tmp2;
else board[i][cury] = board[i+1][cury];
}
for(int i = curx1; i > curx; i--)
{
if(i == curx + 1) board[i][cury1] = tmp1;
else board[i][cury1] = board[i-1][cury1];
}
int mn = INT_MAX;
for(int j = cury; j <= cury1; j++)
{
mn = min(mn, board[curx][j]);
}
for(int j = cury; j <= cury1; j++)
{
mn = min(mn, board[curx1][j]);
}
for(int i = curx; i <= curx1; i++)
{
mn = min(mn, board[i][cury]);
}
for(int i = curx; i <= curx1; i++)
{
mn = min(mn, board[i][cury1]);
}
answer.push_back(mn);
}
return answer;
}
'코딩테스트준비' 카테고리의 다른 글
백준 15685. 드래곤 커브 (구현) (1) | 2023.07.11 |
---|---|
백준 2193. 이친수(DP) (0) | 2023.07.10 |
백준 14889. 스타트와 링크 (조합) (0) | 2023.07.07 |
백준 14502. 연구소 (조합, 구현) (0) | 2023.07.07 |
백준 18428. 감시 피하기 (구현) (0) | 2023.07.05 |
Comments