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

혼종 꼬지마루

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

Algorithms/SIMULATION

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

꼬지마루 2019. 7. 27. 16:25

삼성전자 19년 상반기 기출이라고 해서 예~~~~전부터 풀어보려고 했지만.....귀찮아서 미루고 미루다가 드디어 풀어보았다 ㅋㅋㅋ


어려워 보이고, vector를 쓰면 편할 것 처럼 보이지만 범위가 명확하고, 굳이 vector를 쓰지 않아도 될 것 같아서 그냥 풀었다


1. 입력되는 확인할 target 좌표와 3x3행렬을 입력받는다.


2. 함수는 총 5개를 만들었다. target좌표를 확인할 함수, 행렬을 한줄씩 계산하고 바꿔줄 함수, R, C에 들어갈 각각의 함수를 만들었다.


3. for문으로 dab을 count하게 만들었고, for문이 돌 때 가장 먼저 target좌표의 답을 확인


4. R, C의 길이를 확인하여 CalR, CalC함수를 호출


5. CalR기준으로, 행을 순회하며 열의 값을 tmp_arr배열을 만들어 map의 값을 index로 삼아서 count를 올려준다


6. Cal함수를 호출하여 길이와 tmp_arr함수를 변수로 던져준다


7. Cal함수에서는 구조체 배열에 tmp_arr에 담겨있는 index와 cal을 저장하고, count가 있는 것만 넣어준다


8. 이것을 조건에 맞게 정렬하여, tmp_arr에 다시 저장하여 길이와 함께 갱신하여 함수 종료


9. 리턴된 길이와, tmp_arr의 값을 map에 저장한 후, 최대 C의 길이를 갱신하며 저장한다


10. 모든 프로세스가 종료되면, 각 행마다 길이만큼을 저장한 후, 그 이후의 map안의 요소들을 모두 0으로 바꾸어준다.


11. CalC와 CalR을 조건에 맞게 반복하며 target좌표가 k와 동일한지 검사하며 반복


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <iostream>
#include <algorithm>
#define MXSIZE 102
using namespace std;
 
struct CNT {
    int num, cnt;
}tmp[MXSIZE];
 
int map[MXSIZE][MXSIZE];
int R, C, r, c, k;
 
bool com(const CNT i, const CNT j) {
    return (i.cnt < j.cnt) || (i.cnt == j.cnt && i.num < j.num);
}
 
int checkdab() {
    return map[r][c];
}
 
void Cal(int *len, int arr[]) {
    int ed = 0, cnt = 0;
    for (int i = 0; i <= 100; i++)
        if (arr[i]) { tmp[ed].num = i; tmp[ed++].cnt = arr[i]; }
    sort(tmp, tmp + ed, com);
    for (int i = 0; i < ed; i++) { arr[cnt++= tmp[i].num; arr[cnt++= tmp[i].cnt; }
    (*len) = cnt;
}
 
void CalR() {
    int C_ = C;
    int len_map[MXSIZE] = { 0, };
    for (int i = 0; i < R; i++) {
        int cnt = 0;
        int tmp_arr[MXSIZE] = { 0 };
        for (int j = 0; j < C; j++)
            if (map[i][j])
                tmp_arr[map[i][j]]++;
 
        Cal(&cnt, tmp_arr);
        cnt = cnt > 100 ? 100 : cnt;
 
        for (int j = 0; j < cnt; j++)
            map[i][j] = tmp_arr[j];
 
        len_map[i] = cnt;
        C = cnt > C ? cnt : C;
    }
    for (int i = 0; i < R; i++)
        for (int j = len_map[i]; j < C; j++)
            map[i][j] = 0;
}
 
void CalC() {
    int R_ = R;
    int len_map[MXSIZE] = { 0, };
    for (int i = 0; i < C; i++) {
        int cnt = 0;
        int tmp_arr[MXSIZE] = { 0 };
 
        for (int j = 0; j < R; j++)
            if (map[j][i])
                tmp_arr[map[j][i]]++;
 
        Cal(&cnt, tmp_arr);
        cnt = cnt > 100 ? 100 : cnt;
 
        for (int j = 0; j < cnt; j++)
            map[j][i] = tmp_arr[j];
 
        len_map[i] = cnt;
        R = cnt > R ? cnt : R;
    }
    for (int i = 0; i < C; i++)
        for (int j = len_map[i]; j < R; j++
            map[j][i] = 0;
}
 
int main(void) {
    cin >> r >> c >> k;
    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
            cin >> map[i][j];
    r--; c--;
    R = C = 3;
    int dab;
    for (dab = 0; dab<=101; dab++) {
        if (dab == 101 || checkdab() == k) break;
        if (R >= C) CalR();
        else CalC();
    }
    cout << (dab > 100 ? -1 : dab) << endl;
    return 0;
}
cs


'Algorithms > SIMULATION' 카테고리의 다른 글

[벡준] 3954 - Brainf**k 인터프리터  (2) 2019.10.09
[백준] 17144 - 미세먼지 안녕!  (2) 2019.04.21
[백준] 17143 - 낚시왕  (4) 2019.04.21
[백준] 12793 - 블록 게임  (0) 2019.04.13
[백준] 13337 - 트럭  (0) 2019.04.12