Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
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. 이차원배열과 연산 본문

취업/Algorithm.

백준 17140. 이차원배열과 연산

Azderica 2020. 4. 11. 00:16

이차월배열과 연산

 


Problem?

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

17140번: 이차원 배열과 연산

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

www.acmicpc.net

 

Solution

문제 구현 문제

  1. row_size와 col_size를 비교한다. row_size가 col_size보다 크거나 같으면 R연산을 진행하고 그외에는 C연산을 진행한다.
  2. 연산내에서는 반복횟수를 확인하고 횟수와 숫자 쌍을 vector형태로 저장후 sorting한후에 다시 board에 넣어준다.

Code

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

#define MAX 100

int r, c, k, ans = -1;
int row_size, col_size;
int board[MAX + 1][MAX + 1];

int main(int argc, const char* argv[]) {
    // input
    cin >> r >> c >> k;
    for (int i = 1; i <= 3; i++)
        for (int j = 1; j <= 3; j++)
            scanf("%d", &board[i][j]);
    row_size = 3;
    col_size = 3;

    // solution
    for (int cnt = 0; cnt <= MAX; cnt++) {
        // end state
        if (board[r][c] == k) {
            ans = cnt;
            break;
        }

        if (row_size >= col_size) {   // R, row >= colr
            for (int i = 1; i <= row_size; i++) {
                vector<int> board_count(MAX + 1);
                vector<pair<int, int>> board_set;
                for (int j = 1; j <= col_size; j++) board_count[board[i][j]]++;
                for (int j = 1; j <= MAX; j++)
                    if (board_count[j])
                        board_set.push_back({ board_count[j], j });
                for (int j = 0; j <= col_size; j++) board[i][j] = 0;
                sort(board_set.begin(), board_set.end());
                int j_pos = 1;
                for (int j = 0; j < board_set.size(); j++) {
                    board[i][j_pos++] = board_set[j].second;
                    board[i][j_pos++] = board_set[j].first;
                }
                j_pos--;
                if (j_pos > MAX)
                    col_size = MAX;
                else
                    col_size = max(col_size, j_pos);
            }
        }
        else {    // C, row < col
            for (int j = 1; j <= col_size; j++) {
                vector<int> board_count(MAX + 1);
                vector<pair<int, int>> board_set;
                for (int i = 1; i <= row_size; i++) board_count[board[i][j]]++;
                for (int i = 1; i <= MAX; i++)
                    if (board_count[i])
                        board_set.push_back({ board_count[i], i });
                for (int i = 1; i <= row_size; i++) board[i][j] = 0;
                sort(board_set.begin(), board_set.end());
                int i_pos = 1;
                for (int i = 0; i < board_set.size(); i++) {
                    board[i_pos++][j] = board_set[i].second;
                    board[i_pos++][j] = board_set[i].first;
                }
                i_pos--;
                if (i_pos > MAX)
                    row_size = MAX;
                else
                    row_size = max(row_size, i_pos);
            }
        }
    }

    // output
    cout << ans << "\n";

    return 0;
}

 


  • 구현 문제.
  • 틀려도 연습문제는 다맞고 문제를 확인했을 때 어디서 틀리는지 알수가 없어서 초반에 고생했다.

 

 

 

 

'취업 > Algorithm.' 카테고리의 다른 글

[2020카카오공채] 괄호 변환  (0) 2020.04.11
백준 17837. 새로운 게임2  (0) 2020.04.11
백준 15684. 사다리 조작  (0) 2020.04.11
백준 17472. 다리만들기2  (0) 2020.04.10
백준 17406. 배열 돌리기4  (0) 2020.03.28