Notice
Recent Posts
Recent Comments
«   2024/12   »
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
Archives
Today
Total
관리 메뉴

코린이 탈출기

[백준 17140] 이차원 배열과 연산 본문

문제 풀이/Simulation

[백준 17140] 이차원 배열과 연산

명란파스타 2020. 7. 29. 17:49

문제 바로가기

 

17140번: 이차원 배열과 연산

첫째 줄에 r, c, k가 주어진다. (1 ≤ r, c, k ≤ 100) 둘째 줄부터 3개의 줄에 배열 A에 들어있는 수가 주어진다. 배열 A에 들어있는 수는 100보다 작거나 같은 자연수이다.

www.acmicpc.net

 

시뮬레이션 문제이다

sort함수에서 compare 함수로 custom하게 사용할 수 있다는 것을 알게됐다

R_calculate이랑 C_calculate이랑 로직은 똑같은데 수행하는 게 열 기준/행 기준만 다른데,,

두개를 합치면 더 간단한 코드가 될 수 있을 것 같은데

모르겠당 ㅎ

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <string.h>

using namespace std;

int arr[201][201];
int ncount[201];

int r, c, k;
int cN, cM;
int time;

bool compare(pair<int, int> a, pair<int, int> b)
{
    if (a.second == b.second)
        return a.first < b.first;
    return a.second < b.second;
}
pair<int,int> R_calculate()
{
    int max_arri = 0;
    for (int i = 1; i <= cN; i++)
    {
        int maxx = 0;
        memset(ncount, 0, sizeof(ncount));
        vector<pair<int, int>> number;
        for (int j = 1; j <= cM; j++)
        {
            ncount[arr[i][j]]++;
            maxx = max(maxx, arr[i][j]);
            arr[i][j] = 0;
        }

        for (int j = 1; j <= maxx; j++)
        {
            number.push_back({ j, ncount[j] });
        }
        sort(number.begin(), number.end(), compare);

        int arri = 1;

        for (pair<int, int> tmp : number)
        {
            if (tmp.second)
            {
                arr[i][arri++] = tmp.first;
                arr[i][arri++] = tmp.second;
            }
        }
        max_arri = max(max_arri, arri);
    }

    return { cN, max_arri };
}

pair<int,int> C_calculate()
{
    int max_arri = 0;
    for (int i = 1; i <= cM; i++)
    {
        int maxx = 0;
        memset(ncount, 0, sizeof(ncount));
        vector<pair<int, int>> number;
        for (int j = 1; j <= cN; j++)
        {
            ncount[arr[j][i]]++;
            maxx = max(maxx, arr[j][i]);
            arr[j][i] = 0;
        }

        for (int j = 1; j <= maxx; j++)
        {
            number.push_back({ j, ncount[j] });
        }
        sort(number.begin(), number.end(), compare);

        int arri = 1;

        for (pair<int, int> tmp : number)
        {
            if (tmp.second)
            {
                arr[arri++][i] = tmp.first;
                arr[arri++][i] = tmp.second;
            }            
        }
        max_arri = max(max_arri, arri);
    }

    return { max_arri, cM };
}
int main()
{
    cin >> r >> c >> k;
    for (int i = 1; i <= 3; i++) {
        for (int j = 1; j <= 3; j++)
        {
            cin >> arr[i][j];
        }
    }
    cN = 3;
    cM = 3;

    while (arr[r][c] != k)
    {
        time++;
        if (time > 100)
        {
            time = -1;
            break;
        }
        if (cM <= cN)
        {
            pair<int,int> newSize = R_calculate();
            cN = newSize.first;
            cM = newSize.second;
        }

        else {
            pair<int, int> newSize = C_calculate();
            cN = newSize.first;
            cM = newSize.second;
        }

    }

    cout << time << endl;

    return 0;
}

'문제 풀이 > Simulation' 카테고리의 다른 글

[백준 17779] 게리맨더링 2  (0) 2020.08.02
[백준 3190] 뱀  (0) 2020.08.02
[백준 15684] 사다리 조작  (0) 2020.07.28
[백준 14500] 테트로미노  (3) 2020.07.26
[백준 14499] 주사위 굴리기  (0) 2020.07.26