C++/코드트리 챌린지

[코드트리 챌린지] 1주차 Simulation - 격자 안에서 여러 객체를 이동/ 숫자의 순차적 이동

tmd1 2023. 9. 6. 18:23

https://www.codetree.ai/missions/2/problems/sequential-movement-of-numbers/description

 

코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

 

코드:

#include <bits/stdc++.h>
using namespace std;

int n, m;
int arr[25][25];

int dx[8] = { -1,-1,0,1,1,1,0,-1 }; // 위 방향부터 시계방향
int dy[8] = { 0,1,1,1,0,-1,-1,-1 };

bool InRange(int nx, int ny) {
    return (0 <= nx && nx < n && 0 <= ny && ny < n);
}

void Move(int i, int j) {
    int nxt_i = i;
    int nxt_j = j;
    int maxVal = 0;

    // 8방향에 대해 가장 큰 값을 찾음
    for (int dirNum = 0; dirNum < 8; dirNum++) {
        int nx = i + dx[dirNum];
        int ny = j + dy[dirNum];

        if (InRange(nx, ny) && arr[nx][ny] > maxVal) {
            nxt_i = nx;
            nxt_j = ny;
            maxVal = arr[nxt_i][nxt_j];
        }
    }
    
    // 가장 큰 값과 위치 교환
    int tmp = arr[i][j];
    arr[i][j] = arr[nxt_i][nxt_j];
    arr[nxt_i][nxt_j] = tmp;

    return;
}

void Find(int k) {
    // 1부터 차례로 숫자를 찾고
    // Move() 함수 호출
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (arr[i][j] == k) {
                Move(i, j);
                return;
            }
        }
    }
}

int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> n >> m;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> arr[i][j];
        }
    }

    // m턴 동안
    while (m--) {
        // 1부터 차례로 숫자를 찾음
        for (int k = 1; k <= n * n; k++) {
            Find(k);
        }

    }

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cout << arr[i][j] << " ";
        }
        cout << "\n";
    }
    
}

 

n,m을 입력받고 배열을 채웁니다.

while문으로 m턴 동안 1~n*n 까지의 숫자를 차례로 Find()함수에 매개변수로 넣습니다.

2차원 배열을 모두 탐색하여 숫자 k(1~n*n)를 찾고 그 위치에 대해 Move()함수를 호출합니다.

Move()함수에서 8방향에 대해 가장 큰 값을 탐색하고 위치를 서로 교환합니다.