17140 이차원배열과 연산


시뮬레이션 문제이다.

C++를 이용하는 사람은 벡터와 구조체 정렬

자바를 이용하는 사람은 ArrayList와 클래스 정렬을 사용할줄 안다면 쉽게 풀 수 있지않을까 생각한다.



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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std;
 
int r, c, k, r_len, c_len, res, max_size;
int map[101][101];
 
struct Node {
    int num, count;
    Node(){}
    Node(int n,int c):num(n),count(c){}
};
 
int compared_node(Node &n1, Node &n2) {
    if (n1.count == n2.count )return n1.num < n2.num;
    return n2.count > n1.count;
}
 
void doR(int idx) {
    int check[101= { 0, };
    vector<Node> v;
 
    //각 숫자가 몇번 나왔는지 체크하기.
    for (int i = 1; i <= r_len; i++) {
        int value = map[idx][i];
        check[value]++;
    }
 
    // (숫자, 횟수)로 묶어서 vector에 저장
    for (int i = 1; i <= 100; i++) {
        if (check[i] == 0continue;
        v.push_back(Node(i, check[i]));
    }
 
    //횟수별 - 숫자커지는순으로 정렬
    sort(v.begin(), v.end(), compared_node);
 
    for (int i = 0; i < v.size(); i++) {
        map[idx][2 * i + 1= v.at(i).num;
        map[idx][2 * i + 2= v.at(i).count;
    }
 
    for (int i = v.size() * 2 + 1; i <= 100; i++) {
        map[idx][i] = 0;
    }
 
    if (max_size < v.size() * 2) {
        max_size = v.size() * 2;
    }
}
 
void doC(int idx) {
    int check[101= { 0, };
    vector<Node> v;
 
    //각 숫자가 몇번 나왔는지 체크하기.
    for (int i = 1; i <= c_len; i++) {
        int value = map[i][idx];
        check[value]++;
    }
 
    // (숫자, 횟수)로 묶어서 vector에 저장
    for (int i = 1; i <= 100; i++) {
        if (check[i] == 0continue;
        v.push_back(Node(i, check[i]));
    }
 
    //횟수별 - 숫자커지는순으로 정렬
    sort(v.begin(), v.end(), compared_node);
 
    for (int i = 0; i < v.size(); i++) {
        map[2 * i + 1][idx] = v.at(i).num;
        map[2 * i + 2][idx] = v.at(i).count;
    }
 
    for (int i = v.size() * 2 + 1; i <= 100; i++) {
        map[i][idx] = 0;
    }
 
    if (max_size < v.size() * 2) {
        max_size = v.size() * 2;
    }
}
 
void printMap() {
    printf("\n");
    for (int i = 1; i <= r_len; i++) {
        for (int j = 1; j <= c_len; j++) {
            printf("%d ", map[i][j]);
        }
        printf("\n");
    }
}
 
int main(){
 
    r_len = 3;
    c_len = 3;
    res = 0;
 
    scanf("%d %d %d"&r, &c, &k);
 
    for (int i = 1; i <= 3; i++) {
        for (int j = 1; j <= 3; j++) {
 
            scanf("%d"&map[i][j]);
        }
    }
 
    while (true) {
 
        if (map[r][c] == k) {
            printf("%d\n", res);
            break;
        }
 
        if (res == 100) {
            printf("-1\n");
            break;
        }
        ++res;
 
        //printMap();
        //printf("r_len : %d, c_len : %d", r_len, c_len);
 
        max_size = 0;
        if (r_len >= c_len) {
            for (int i = 1; i <= r_len; i++) {
                doR(i);
                
            }
            c_len = max_size;
        }
        else {
            for (int i = 1; i <= c_len; i++) {
                doC(i);
            }
            r_len = max_size;
        }
    }
}
cs


'BOJ::문제풀이' 카테고리의 다른 글

17142 연구소 3  (0) 2019.04.17
16235 나무 재테크  (0) 2018.10.22
16236 아기상어  (0) 2018.10.22
16234 인구 이동  (0) 2018.10.22
15684 사다리 조작  (0) 2018.09.07

+ Recent posts