반응형
문제
https://www.acmicpc.net/problem/17140
접근방법
1) 접근 사고
까다로운 구현 문제였습니다. 자세한 로직은 주석으로 첨부하였습니다.
2) 시간 복잡도
O(N^2)
3) 배운 점
특별히 없는거 같습니다.
4) PS
정답 코드
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
|
#include<bits/stdc++.h>
#define fastio ios::sync_with_stdio(0), cin.tie(0). cout.tie(0);
using namespace std;
const int MAX = 101;
int board[MAX][MAX];
int R, C, K;
int main() {
cin >> R >> C >> K;
//board에서 조회값을 해야하므로 1씩 감축
R--, C--;
bool flag = false;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
int num;
cin >> num;
board[i][j] = num;
//이미 탐색이 가능하며 K값일 경우 flag = true;
if (i == R && j == C && num == K)
flag = true;
}
}
//기본 row, col 값
int row = 3;
int col = 3;
int cnt = 0;
while (!flag){
cnt++;
//100이상일 경우 -1을 출력하고 탐색 종료
if (cnt > 100) {
cout << -1 << "\n";
return 0;
}
vector<pair<int, int>> v[MAX];
//R정렬
if (row >= col) {
for (int i = 0; i < row; i++) {
int cnt[MAX] = {0,};
//나온 숫자들의 갯수를 확인해주는 과정
for (int j = 0; j < col; j++)
cnt[board[i][j]]++;
//나온 숫자들이 있는 경우 나온 횟수와 숫자의 쌍을 대입한다.
for (int j = 1; j < MAX; j++) {
if (cnt[j])
v[i].push_back({cnt[j], j});
}
}
//board의 값을 정렬한 이후의 board로 갱신해주기 위한 board 초기화
memset(board, 0, sizeof(board));
//나온 횟수가 적은 순서를 위한 정렬
for (int i = 0; i < row; i++)
sort(v[i].begin(), v[i].end());
//board에 값을 최신화 하는 과정
for (int i = 0; i < row; i++) {
int idx = 0;
for (int j = 0; j < v[i].size(); j++) {
board[i][idx++] = v[i][j].second;
if (idx == MAX)
break;
board[i][idx++] = v[i][j].first;
if (idx == MAX)
break;
}
//row의 값이 길어지면 col도 늘어나므로 크기를 갱신해준다.
col = max(col, idx);
}
}
//C정렬(위와 동일함)
else{
for(int i = 0; i <col; i++){
int cnt[MAX] = {0};
for(int j = 0; j < row; j++)
cnt[board[j][i]]++;
for(int j = 1; j < MAX; j++){
if(cnt[j]){
v[i].push_back({cnt[j], j});
}
}
}
memset(board, 0, sizeof(board));
for(int i = 0; i < col; i++){
sort(v[i].begin(), v[i].end());
}
for(int i = 0; i < col; i++){
int idx = 0;
for(int j = 0; j < v[i].size(); j++){
board[idx++][i] = v[i][j].second;
if(idx == MAX)
break;
board[idx++][i] = v[i][j].first;
if (idx == MAX)
break;
}
row = max(row, idx);
}
}
if(board[R][C] == K){
flag = true;
break;
}
}
cout << cnt <<"\n";
}
|
cs |
반응형
'백준문제풀이 > 구현' 카테고리의 다른 글
17779번-게리멘더링2 (0) | 2021.09.16 |
---|---|
17142번-연구소3 (0) | 2021.09.15 |
17143번-낚시왕 (0) | 2021.09.15 |
17144번-미세먼지 안녕 (0) | 2021.09.14 |
16236번-아기상어 (0) | 2021.09.14 |