💡 구현/시뮬레이션/정렬
Memory 2064KB Time 4ms Code Length 3203B
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
//- 각각의 수가 몇번 나왔는지 파악.
//- vector에 넣어 정렬해주기
//- map에 입력해주기
//-행의 개수와 열의 개수를 구해야한다.Max행, Max열
//- 100초가 지나도 A[r][c] = k 가 아니라면 - 1 출력
//- 행 또는 열의 크기가 100을 넘어가는 경우에는 처음 100개를 제외한 나머지는 버린다.
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
struct info {
int number;
int times;
};
bool cmp(const info &first,const info& second) { // 나온 횟수가 적고 앞에 숫자가 작은 순대로
if (first.times < second.times) {
return true;
}
else if (first.times == second.times) {
if (first.number < second.number) {
return true;
}
}
return false;
}
int r, c, k;
int MaxY, MaxX;
int map[100][100];
void init() {
memset(map, 0, sizeof(map));
MaxY = 3; MaxX = 3;
cin >> r >> c >> k;
r -= 1; // 인덱스 0으로 줄이기
c -= 1; // 인덱스 0으로 줄이기
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++)
cin >> map[i][j];
}
}
void Rcal(int Y) { // 가로로 진행
vector<info> vc; // 임시로 담을 벡터 생성
int mem[101] = {0};
for (int i = 0; i < MaxX; i++) {
mem[map[Y][i]] ++;
map[Y][i] = 0; // 초기화도 진행
}
// 벡터에 옮겨 담기
for (int i = 1; i <= 100; i++) {
if (mem[i] == 0) continue;
vc.push_back({ i,mem[i] });
}
// 정렬
sort(vc.begin(), vc.end(), cmp);
// map 만들기
for (int i = 0; (i < vc.size()) && (i < 50); i++) { // 100 이상의 인덱스는 버림.
map[Y][i*2] = vc[i].number;
map[Y][i*2 + 1] = vc[i].times;
}
}
void Ccal(int X) { // 세로로 진행
vector<info> vc; // 임시로 담을 벡터 생성
int mem[101] = { 0 };
for (int i = 0; i < MaxY; i++) {
mem[map[i][X]] ++;
map[i][X] = 0; // 초기화도 진행
}
// 벡터에 옮겨 담기
for (int i = 1; i <= 100; i++) {
if (mem[i] == 0) continue;
vc.push_back({ i,mem[i] });
}
// 정렬
sort(vc.begin(), vc.end(), cmp);
// map 만들기
for (int i = 0; (i < vc.size()) && (i < 50); i++) { // 100 이상의 인덱스는 버림.
map[i*2][X] = vc[i].number;
map[i*2+1][X] = vc[i].times;
}
}
void FindMax() {
int findmaxX = 0;
for (int i = 0; i < 100; i++) {
int nowX = 0;
for (int j = 0; j < 100; j++) {
if (map[i][j] != 0) nowX++;
}
if (nowX > findmaxX) findmaxX = nowX;
}
MaxX = findmaxX;
int findmaxY = 0;
for (int i = 0; i < 100; i++) {
int nowY = 0;
for (int j = 0; j < 100; j++) {
if (map[j][i] != 0) nowY++;
}
if (nowY > findmaxY) findmaxY = nowY;
}
MaxY = findmaxY;
}
void printMap() {
for (int i = 0; i < MaxY; i++) {
for (int j = 0; j < MaxX; j++) {
cout << map[i][j] << " ";
}
cout << endl;
}
cout << endl;
}
int main() {
init();
int time = 0;
int result = 0;
while (1) {
if (map[r][c] == k) {
result = time;
break;
}
if (MaxY >= MaxX) {
for (int i = 0; i < MaxY; i++) {
Rcal(i);
}
}
else {
for (int i = 0; i < MaxX; i++) {
Ccal(i);
}
}
FindMax(); // 가장 긴 열 찾기
//printMap(); // debug용
time++;
if (time > 100) { // 시간 오바
result = -1;
break;
}
}
cout << result;
}
이 코드는 주어진 행렬을 조건에 맞게 변형하여 원하는 값이 나올 때까지 반복하는 프로그램이다.
초기에는 주어진 행렬을 입력받고, 행과 열의 개수를 구한다.
주어진 조건에 따라 행렬을 변형하는 함수를 정의하고, 해당 함수를 이용해 행 또는 열을 변형한다.
변형된 행렬에서 가장 긴 행과 열의 길이를 찾는다.
주어진 값이 나올 때까지 2, 3의 과정을 반복하며 시간을 측정한다.
만약 100초가 지나도 주어진 값이 나오지 않는다면 -1을 출력하고, 그렇지 않으면 걸린 시간을 출력한다.