Game Develop

[Algorithm] Programmers :: 행렬 테두리 회전하기 본문

Algorithm/Programmers

[Algorithm] Programmers :: 행렬 테두리 회전하기

MaxLevel 2022. 8. 3. 12:34

https://school.programmers.co.kr/learn/courses/30/lessons/77485

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
    vector<int> answer;
 
    int row = rows - 1;
    int column = columns - 1;
    vector<pair<int,int>> dir = { {1,0}, {0,1}, {-1,0}, {0,-1} }; // 시계방향 역순.
    vector<vector<int>> matrix(rows, vector<int>(columns, 0));
 
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < columns; j++)
        {
            matrix[i][j] = columns * i + j + 1;
        }
    }
 
    for (int i = 0; i < queries.size(); i++)
    {
        int startRow = queries[i][0- 1;
        int startCol = queries[i][1- 1;
        int endRow = queries[i][2- 1;
        int endCol = queries[i][3- 1;
        int startNum = matrix[startRow][startCol];
        int minNum = startNum;
        int curRow = startRow;
        int curCol = startCol;
        int dirIndex = 0;
        vector<int> dirCount = { endRow - startRow , endCol - startCol, endRow - startRow, endCol - startCol };
 
        while (1)
        {
            if (dirCount[dirIndex] == 0)
            {
                dirIndex++;
                continue;
            }
 
            int nextRow = curRow + dir[dirIndex].first;
            int nextCol = curCol + dir[dirIndex].second;
 
            if(nextRow == startRow && nextCol == startCol)
            {
                matrix[curRow][curCol] = startNum;
                break;
            }
 
            dirCount[dirIndex]--;
            matrix[curRow][curCol] = matrix[nextRow][nextCol];
 
            if (matrix[curRow][curCol] < minNum)
            {
                minNum = matrix[curRow][curCol];
            }
 
            curRow = nextRow;
            curCol = nextCol;
        }
 
        answer.push_back(minNum);
    }
 
    return answer;
}
cs

 

풀고나서 왜 굳이 이렇게 풀었지?라고 생각한 문제다. 아마 바로 직전에 풀었었던 퍼즐채우기문제에 영향을 받은게 아닌가..하는 생각이 든다.

 

정해진 영역의 테두리만 시계방향으로 한칸씩 옮기고 옮기는 타일중 제일 작은 수를 찾는건데, 회전시키는게 관건이다.

그런데 테두리만 돌리면 되기 때문에 사실 반복문 4번 써서 하면 된다.

나는 역시계방향 순서로, 각 방향마다 움직일수있는 count를 저장해놓고 0이되면 방향을 전환하면서 이동시키는... 식으로 코드를 짰다. 사실 굳이?라는 느낌이긴 한데, 그래도 다른 방식으로 풀어보는것도 좋으니까 그러려니 한다.