본문 바로가기

성우리뷰

좌석 배치시키기

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

int board[50][50];
int dist[50][50];
queue<pair<int, int>> q;
int dx[4] = { 0,0,1,-1 };
int dy[4] = { 1,-1,0,0 };

vector<int> solution(int n, int kk) {
    vector<int> answer;
    for (int i = 0; i < 6; i++) {
        for (int j = 0; j < 6; j++) {
            board[i][j] = 0;
        }
    }

    board[0][0] = 1;
    q.push(make_pair(0, 0));

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            dist[i][j] = 2100000000;
        }
    }
    dist[0][0] = 0;

    //총 n*n번 숫자 집어넣기
    for (int i = 2; i <= n * n; i++) {
        //거리계산 후
        while (!q.empty()) {
            int x = q.front().first;
            int y = q.front().second;
            q.pop();

            for (int i = 0; i < 4; i++) {
                int nx = x + dx[i];
                int ny = y + dy[i];
                if (nx < 0 || ny < 0 || nx >= n || ny >= n) {
                    continue;
                }
                if (dist[nx][ny] == 0)
                    continue;

                if (dist[nx][ny] > dist[x][y] + 1) {
                    dist[nx][ny] = dist[x][y] + 1;
                    q.push(make_pair(nx, ny));
                }
            }
        }

        //가장 먼 곳을 찾아
        int farx = 0; int fary = 0; int maxfar = 0;
        for (int j = 0; j < n; j++) {
            for (int k = 0; k < n; k++) {
                if (dist[k][j] > maxfar) {
                    maxfar = dist[k][j];
                    farx = k; fary = j;
                }
            }
        }

        //그곳에 다음 숫자 대입 후
        board[farx][fary] = i;

        //dist를 다시 초기화 및 숫자 적힌 곳을 큐로 넣음
        for (int j = 0; j < n; j++) {
            for (int k = 0; k < n; k++) {
                //이미 관객이 들어왔다면, q에 넣고, 해당 거리는 0
                if (board[j][k] != 0) {
                    q.push(make_pair(j, k));
                    dist[j][k] = 0;
                }
                else
                    dist[j][k] = 2100000000;
            }
        }
    }

    for (int j = 0; j < n; j++) {
        for (int k = 0; k < n; k++) {
            if (board[j][k] == kk) {
                answer.push_back(j + 1);
                answer.push_back(k + 1);
            }
        }
    }
    return answer;
}

int main() {
    vector<int> ans = solution(5, 12);
    for (auto a : ans)
        cout << a << " ";
    cout << "\n";

    ans = solution(5, 16);
    for (auto a : ans)
        cout << a<< " ";
    cout << "\n";

    ans = solution(6, 13);
    for (auto a : ans)
        cout << a << " ";
    cout << "\n";
}