본문 바로가기
알고리즘

[알고리즘] 이차원 배열과 연산

by keel_im 2021. 4. 10.
반응형

포인트

  • 배열을 잘 구현을 할 수 있는가? 숫자를 세는 방법을 cnt[] 배열을 이용하여 값으로 하는 방법
  • 정렬 방법을 잘 생각하면 간단하게 해결할 수도 있다. 
  • 구하고자 하는 바를 안다면 잘 구할실 수 있습니다. 전체 데이터를 셋팅을 하고 잘 살펴보시면 됩니다. 천천히 급하다가 구현 부분 놓치니까요
  • 문제의 익숙해지는 것이 중요합니다. 모르면 답을 보는 것도 방법 입니다. 

🧶문서는 항상 수정 될 수 있습니다. 비판은 환영합니다. 

c++/cpp

#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>

using namespace std;

int n, m, k, answer;
int map[101][101];
int cnt[101];

void sorting() {
    int a = 0; // 시간
    int x = 3; // 높이
    int y = 3; //너비

    while (1) {
        if (map[n][m] == k) { // k를 찾으면 정답을 해당시간으로 하고 종료
            answer = a;
            return ;
        }
        if (a > 100) { //100 이상이면 종료
            answer = -1;
            return ;
        }

        vector<int> size; // 사이즈를 저장해서 행연산이나 열연산을 하기 위하여
        if (x >= y)    // 정사각형이거나 세로로긴 형태
        {
            for (int i = 1; i <= x; i++) {
                vector<pair<int, int>> V;
                memset(cnt, 0, sizeof(cnt));
                for (int j = 1; j <= y; j++) cnt[map[i][j]]++; //값을 센다.
                for (int j = 1; j < 101; j++) {
                    if (cnt[j] == 0) continue; // 카운트한 수가 0이면 0
                    V.push_back(make_pair(cnt[j], j)); //pair 로 만드어서
                }
                sort(V.begin(), V.end()); //정렬
                for (int j = 1; j <= y; j++) map[i][j] = 0;
                int index = 1;
                for (auto ele : V) {
                    map[i][index++] = ele.second; //연산자 주위할 것
                    map[i][index++] = ele.first;
                }
                size.push_back(--index); //특히 이 부분
            }
            sort(size.begin(), size.end());
            y = size.back();
        } else        // 가로로 더 긴꼴
        {
            for (int i = 1; i <= y; i++) {
                vector<pair<int, int>> V;
                memset(cnt, 0, sizeof(cnt));
                for (int j = 1; j <= x; j++) cnt[map[j][i]]++;
                for (int j = 1; j < 101; j++) {
                    if (cnt[j] != 0) {
                        V.push_back(make_pair(cnt[j], j));
                    }
                }
                sort(V.begin(), V.end());
                for (int j = 1; j <= x; j++) map[j][i] = 0;
                int index = 1;
                for (auto ele : V) {
                    map[index++][i] = ele.second;
                    map[index++][i] = ele.first;
                }

                size.push_back(--index);
            }
            sort(size.begin(), size.end()); // 사이즈 정렬
            x = size.back(); // 끝값을 가져온다.
        }
        a+=1;
    }
}


int main(void) {
    cin >> n >> m >> k;
    for (int i = 1; i <= 3; i++) {
        for (int j = 1; j <= 3; j++) {
            cin >> map[i][j];
        }
    }
    if (map[n][m] == k) {
        answer = 0;
        cout << answer << endl;
        return 0;
    }
    sorting();
    cout << answer << endl;
    return 0;
}

python

r, c, k = map(int, input().split())
r -= 1
c -= 1

data = [[0] * 100 for _ in range(100)]


def calc() -> int:
    """
	r연산과 c 연산을 지속적으로 하는 함수
    :rtype: int
    """
    time = 1
    x = 3
    y = 3
    while time <= 100:
        if x >= y:
            # R 연산
            max_len = 0
            for row in range(x):
                counter = dict()
                v = []
                for col in range(y):
                    if data[row][col] == 0:
                        continue
                    counter[data[row][col]] = counter.get(data[row][col], 0) + 1
                    data[row][col] = 0

                for key, value in counter.items():
                    v.append([key, value])
                v.sort(key=lambda x: (x[1], x[0]))
                index = 0

                for ele1, ele2 in v:
                    data[row][index] = ele1
                    index += 1
                    data[row][index] = ele2
                    index += 1
                max_len = max(max_len, index)
            y = max_len

        else:
            max_len = 0
            for col in range(y):
                counter = dict()
                v = []
                for row in range(x):
                    if data[row][col] == 0:
                        continue
                    counter[data[row][col]] = counter.get(data[row][col], 0) + 1
                    data[row][col] = 0

                for key, value in counter.items():
                    v.append([key, value])
                v.sort(key=lambda x: (x[1], x[0]))
                index = 0

                for ele1, ele2 in v:
                    data[index][col] = ele1
                    index += 1
                    data[index][col] = ele2
                    index += 1
                max_len = max(max_len, index)
            x = max_len

        if data[r][c] == k:
            return time

        time += 1
    return -1


for i in range(3):
    temp = list(map(int, input().split()))
    for j in range(3):
        data[i][j] = temp[j]

result = 0
if data[r][c] == k:
    print(0)
else:
    result = calc()
    print(result)
반응형

'알고리즘' 카테고리의 다른 글

[알고리즘] 원판 돌리기  (0) 2021.04.14
[알고리즘] Deepest Leaves Sum  (0) 2021.04.11
[알고리즘] 등산로 조성  (0) 2021.04.09
[알고리즘] 디저트 카페  (0) 2021.04.09
[알고리즘] Determine if String Halves Are Alike  (0) 2021.04.07

댓글