Algorithm/삼성 SW 역량 테스트 기출 문제

[Baekjoon][17140] 이차원 배열과 연산

어발 2022. 2. 18. 15:45

출처 - 백준사이트

17140번: 이차원 배열과 연산

나의 풀이

정렬을 하는 과정에서 tempmap이라는 배열에 각 인덱스가 숫자를 지칭하고 인덱스의 값이 숫자의 갯수를 의미하도록 구현하였다.

#include <iostream>
#include <cstring>

#define MAX_SIZE    100

using namespace std;

int map[MAX_SIZE][MAX_SIZE];
int r, c, k;
int max_r = 3, max_c = 3;
int result;

void printMap() {
    cout << "\n";

    for (int y = 0 ; y < max_r ; y++) {
        for (int x = 0; x < max_c ; x++) {
            cout.width(3);
            cout << map[y][x] << " ";
        }

        cout << "\n";
    }
}

void func_r() {
    for (int y = 0 ; y < max_r ; y++) {
        int tempmap[101] = {0, };

        for (int x = 0 ; x < max_c ; x++)
            tempmap[map[y][x]]++;

        int check_num = 1;
        int write_idx = 0;
        memset(map[y], 0, sizeof(map[y]));

        for (int cnt = 0 ; cnt < 100 ; cnt++) {
            for (int x = 1 ; x < 101 ; x++) {
                if (tempmap[x] == check_num) {
                    map[y][write_idx++] = x;
                    map[y][write_idx++] = check_num;
                }
            }

            check_num++;
        }

        if (max_c < write_idx)
            max_c = write_idx;
    }
}

void func_c() {
    for (int x = 0 ; x < max_c ; x++) {
        int tempmap[101] = {0, };

        for (int y = 0 ; y < max_r ; y++)
            tempmap[map[y][x]]++;

        int check_num = 1;
        int write_idx = 0;
        for (int y = 0 ; y < max_r ; y++)
            map[y][x] = 0;

        for (int cnt = 0 ; cnt < 100 ; cnt++) {
            for (int y = 1 ; y < 101 ; y++) {
                if (tempmap[y] == check_num) {
                    map[write_idx++][x] = y;
                    map[write_idx++][x] = check_num;
                }
            }

            check_num++;
        }

        if (max_r < write_idx)
            max_r = write_idx;
    }
}

int main() {
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);

    cin >> r >> c >> k;

    for (int y = 0 ; y < 3 ; y++) {
        for (int x = 0 ; x < 3 ; x++)
            cin >> map[y][x];
    }

    while (1) {
        if (map[r-1][c-1] == k)
            break;

        if (result > 100) {
            result = -1;
            break;
        }

        if (max_r >= max_c)
            func_r();
        else
            func_c();

        result++;
        printMap();
    }

    cout << result;

    return 0;
}
728x90