백준문제풀이/구현

17140번-이차원 배열과 연산

반응형

문제

https://www.acmicpc.net/problem/17140

 

17140번: 이차원 배열과 연산

첫째 줄에 r, c, k가 주어진다. (1 ≤ r, c, k ≤ 100) 둘째 줄부터 3개의 줄에 배열 A에 들어있는 수가 주어진다. 배열 A에 들어있는 수는 100보다 작거나 같은 자연수이다.

www.acmicpc.net


접근방법

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<intint>> 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, 0sizeof(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, 0sizeof(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