프로그래밍/코딩테스트

코딩 테스트 : 행렬 테두리 회전하기

백사니 2025. 3. 31. 10:06
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
반응형