본문 바로가기
프로그래머스/C

[프로그래머스/C]프로그래머스 Level 2 : 행렬 테두리 회전하기 C언어

by starfish22 2022. 4. 23.
728x90

▶문제 : 코딩테스트 연습 - 행렬 테두리 회전하기 | 프로그래머스 (programmers.co.kr)

 

코딩테스트 연습 - 행렬 테두리 회전하기

6 6 [[2,2,5,4],[3,3,6,6],[5,1,6,3]] [8, 10, 25] 3 3 [[1,1,2,2],[1,2,2,3],[2,1,3,2],[2,2,3,3]] [1, 1, 5, 3]

programmers.co.kr

 

▶코드 작성

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int arr[100][100];

int minNumber(int top, int bottom, int left, int right)//테두리 회전, 최솟값 찾기
{
    int point = arr[top][left]; //왼쪽 위 숫자 회전을 위해 따로 저장
    int min = point;
    
    for (int i = top + 1; i <= bottom; i++) {//왼쪽 세로줄 위쪽으로 이동
        arr[i - 1][left] = arr[i][left];
        if (min > arr[i][left]) min = arr[i][left];//최솟값 찾기
    }
    
    for (int i = left + 1; i <= right; i++) {//아랫줄 왼쪽으로 이동
        arr[bottom][i - 1] = arr[bottom][i];
        if (min > arr[bottom][i]) min = arr[bottom][i];
    }
    
    for (int i = bottom - 1; i >= top; i--) {//오른쪽 세로줄 아래로 이동
        arr[i + 1][right] = arr[i][right];
        if (min > arr[i][right]) min = arr[i][right];
    }
    
    for (int i = right - 1; i >= left; i--) {//윗줄 오른쪽으로 이동
        arr[top][i + 1] = arr[top][i];
        if (min > arr[top][i]) min = arr[top][i];
    }
    
    arr[top][left + 1] = point;//처음에 따로 저장한 값 오른쪽으로 이동
    return min;
}

// queries_row_len은 2차원 배열 queries의 행(세로) 길이입니다.
// queries_col_len은 2차원 배열 queries의 열(가로) 길이입니다.
// queries[i][j]는 queries의 i번째 행의 j번째 열에 저장된 값을 의미합니다.
int *solution(int rows, int columns, int **queries, size_t queries_row_len, size_t queries_col_len)
{
    int *answer = (int *)malloc(queries_row_len * sizeof(int));

    int n = 1;
    for (int i = 0; i < rows; i++) {//행렬 생성
        for (int j = 0; j < columns; j++) {
            arr[i][j] = n++;
        }
    }

    for (int i = 0; i < queries_row_len; i++) {//반복으로 회전함수 호출 후 최솟값 저장
        answer[i] = minNumber(queries[i][0] - 1, queries[i][2] - 1, queries[i][1] - 1, queries[i][3] - 1);
    }

    return answer;
}

 

▶해석

arr배열에 1부터 rows*columns까지 대입해 행렬을 만든다.

queries배열에 있는 회전 개수만큼 반복하여 minNumber함수를 호출한다.

이때 함수 인자로 회전하는 테두리의 윗줄 : top , 아랫줄 : bottom , 왼쪽 : left , 오른쪽 : right을 지정해 편하게 이용하도록 한다.

minNumber함수를 보면 회전을 할 때 간편히 회전을 하도록 숫자 하나를 빼서 point에 저장한다. 이때 숫자를 뺀 자리는 왼쪽 위 꼭짓점 부분에 있던 숫자이다.

 

이제 시계방향으로 이동하면 된다.

point변수에 저장한 그 자리를 시작으로 왼쪽 세로줄부터 한 칸씩 위로 이동한다. 이동하면서 최솟값 비교도 같이 해준다.

세로줄이 이동하면 맨 아래에 공간이 생기므로 아랫줄로 그 공간을 채워준다. 아랫줄을 왼쪽으로 이동한다.

다음 오른쪽 세로줄이 아래로 이동하고, 윗줄이 오른쪽으로 이동한다.

마지막으로 point변수에 저장한 값을 오른쪽으로 이동한 자리에 넣어주면 테두리가 시계방향으로 회전한 꼴이 된다.

 

최솟값 min을 반환하여 answer에 대입한 후 answer을 반환한다.

 

728x90

댓글