728x90
반응형
해당 문제는 주어진 범위만큼만 시계방향으로 회전시키는 문제로 queries로 벡터를 추출해서 해당 벡터의 범위만큼 회전시키고 제일 작은 수를 반환해주는 함수를 구현하면 되는 문제이다.
#include <string>
#include <vector>
#include <climits> // INT_MAX를 사용하기 위한 헤더
using namespace std;
// 테두리 회전 함수
int turn(vector<vector<int>>& map, vector<int> v) {
int k = 0; // 방향 인덱스
// 시계방향 이동을 위한 방향 배열 (오른쪽, 아래, 왼쪽, 위)
vector<pair<int, int>> direction = { {0, 1}, {1, 0}, {0, -1}, {-1, 0} };
int minValue = INT_MAX; // 최솟값 초기화(최댓값으로)
// 시작위치 가져오기
int i = v[0] - 1; // 시작 행
int j = v[1] - 1; // 시작 열
int prev = map[i][j]; // 처음 위치의 값 저장
// 테두리를 따라 회전
while (k < 4) { // 4개의 방향에 대해 반복
int ny = i + direction[k].first; // 다음 y 좌표
int nx = j + direction[k].second; // 다음 x 좌표
// 범위를 벗어나는 경우 방향을 변경
if (ny >= v[2] || nx >= v[3] || ny < v[0] - 1 || nx < v[1] - 1) {
k++; // 다음 방향으로 이동
continue;
} else {
minValue = min(minValue, prev); // 현재 위치의 값과 최솟값 비교
int temp = map[ny][nx]; // 다음 위치의 값 저장
map[ny][nx] = prev; // 현재 위치의 값으로 업데이트
prev = temp; // 이전 위치 업데이트
}
i = ny; // 현재 위치 업데이트
j = nx; // 현재 위치 업데이트
}
return minValue; // 최솟값 반환
}
// 메인 솔루션 함수
vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
vector<int> answer; // 결과를 저장할 벡터
vector<vector<int>> map(rows, vector<int>(columns, 0)); // 행렬 초기화
int num = 1; // 행렬에 채울 숫자
// 행렬을 초기화
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
map[i][j] = num; // 숫자 채우기
num++;
}
}
// 쿼리 처리
for (vector<int> v : queries) {
answer.push_back(turn(map, v)); // 회전 후 최솟값을 결과에 추가
}
return answer; // 결과 반환
}
728x90
반응형
'프로그래밍 > 코딩테스트' 카테고리의 다른 글
코딩테스트 : 석유 시추관 최적 위치 (0) | 2025.04.08 |
---|---|
코딩테스트 : 디펜스 게임 (0) | 2025.03.31 |
코딩테스트 : 리코쳇 로봇 (0) | 2025.03.31 |
코딩테스트 : 수식 최대화 (0) | 2025.03.02 |
코딩테스트 : 괄호 변환 (0) | 2025.03.02 |