티스토리 뷰
문제
크기가 3×3인 배열 A가 있다. 1초가 지날때마다 배열에 연산이 적용된다.
- R 연산: 배열 A의 모든 행에 대해서 정렬을 수행한다. 행의 개수 ≥ 열의 개수인 경우에 적용된다.
- C 연산: 배열 A의 모든 열에 대해서 정렬을 수행한다. 행의 개수 < 열의 개수인 경우에 적용된다.
한 행 또는 열에 있는 수를 정렬하려면, 각각의 수가 몇 번 나왔는지 알아야 한다. 그 다음, 수의 등장 횟수가 커지는 순으로, 그러한 것이 여러가지면 수가 커지는 순으로 정렬한다. 그 다음에는 배열 A에 정렬된 결과를 다시 넣어야 한다. 정렬된 결과를 배열에 넣을 때는, 수와 등장 횟수를 모두 넣으며, 순서는 수가 먼저이다.
예를 들어, [3, 1, 1]에는 3이 1번, 1가 2번 등장한다. 따라서, 정렬된 결과는 [3, 1, 1, 2]가 된다. 다시 이 배열에는 3이 1번, 1이 2번, 2가 1번 등장한다. 다시 정렬하면 [2, 1, 3, 1, 1, 2]가 된다.
정렬된 결과를 배열에 다시 넣으면 행 또는 열의 크기가 달라질 수 있다. R 연산이 적용된 경우에는 가장 큰 행을 기준으로 모든 행의 크기가 변하고, C 연산이 적용된 경우에는 가장 큰 열을 기준으로 모든 열의 크기가 변한다. 행 또는 열의 크기가 커진 곳에는 0이 채워진다. 수를 정렬할 때 0은 무시해야 한다. 예를 들어, [3, 2, 0, 0]을 정렬한 결과는 [3, 2]를 정렬한 결과와 같다.
행 또는 열의 크기가 100을 넘어가는 경우에는 처음 100개를 제외한 나머지는 버린다.
배열 A에 들어있는 수와 r, c, k가 주어졌을 때, A[r][c]에 들어있는 값이 k가 되기 위한 최소 시간을 구해보자.
입력
첫째 줄에 r, c, k가 주어진다. (1 ≤ r, c, k ≤ 100)
둘째 줄부터 3개의 줄에 배열 A에 들어있는 수가 주어진다. 배열 A에 들어있는 수는 100보다 작거나 같은 자연수이다.
출력
A[r][c]에 들어있는 값이 k가 되기 위한 연산의 최소 시간을 출력한다. 100초가 지나도 A[r][c] = k가 되지 않으면 -1을 출력한다.
코드
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
int R;
int C;
int K;
int r_size;
int c_size;
int A[101][101];
unordered_map<int, int> um;
unordered_map<int, int>::iterator it;
vector< pair<int, int> > tmp;
void r_sorting()
{
int i, j;
int size, curr = c_size;
for (i = 1; i <= r_size; i++)
{
for (j = 1; j <= curr; j++)
{
if (A[i][j] != 0)
um[A[i][j]]++;
}
for (it = um.begin(); it != um.end(); it++)
{
tmp.push_back(make_pair(it->second, it->first));
}
sort(tmp.begin(), tmp.end());
size = tmp.size();
if (size > 50) size = 50;
for (j = 0; j < size; j++)
{
A[i][2 * j + 1] = tmp[j].second;
A[i][2 * j + 2] = tmp[j].first;
}
for (j = size * 2 + 1; j <= curr; j++)
A[i][j] = 0;
if (c_size < size * 2)
c_size = size * 2;
um.clear();
tmp.clear();
}
}
void c_sorting()
{
int i, j;
int size, curr = r_size;
for (i = 1; i <= c_size; i++)
{
for (j = 1; j <= curr; j++)
{
if (A[j][i] != 0)
um[A[j][i]]++;
}
for (it = um.begin(); it != um.end(); it++)
{
tmp.push_back(make_pair(it->second, it->first));
}
sort(tmp.begin(), tmp.end());
size = tmp.size();
if (size > 50) size = 50;
for (j = 0; j < size; j++)
{
A[2 * j + 1][i] = tmp[j].second;
A[2 * j + 2][i] = tmp[j].first;
}
for (j = size * 2 + 1; j <= curr; j++)
A[j][i] = 0;
if (r_size < size * 2)
r_size = size * 2;
um.clear();
tmp.clear();
}
}
int main()
{
int i, j;
cin >> R >> C >> K;
for (i = 1; i <= 3; i++)
{
for (j = 1; j <= 3; j++)
{
cin >> A[i][j];
}
}
r_size = 3;
c_size = 3;
for (i = 0; i <= 100; i++)
{
if (A[R][C] == K)
break;
if (r_size >= c_size)
r_sorting();
else
c_sorting();
}
if (i > 100)
cout << -1 << endl;
else
cout << i << endl;
return 0;
}
링크
17140번: 이차원 배열과 연산
첫째 줄에 r, c, k가 주어진다. (1 ≤ r, c, k ≤ 100) 둘째 줄부터 3개의 줄에 배열 A에 들어있는 수가 주어진다. 배열 A에 들어있는 수는 100보다 작거나 같은 자연수이다.
www.acmicpc.net
inbdni/Baekjoon
Contribute to inbdni/Baekjoon development by creating an account on GitHub.
github.com
'Coding Test > Baekjoon' 카테고리의 다른 글
[백준] 15658번 - 연산자 끼워넣기 (2) / C++ (0) | 2021.02.01 |
---|---|
[백준] 17143번 - 낚시왕 / C++ (0) | 2021.02.01 |
[백준] 17144번 - 미세먼지 안녕! / C++ (0) | 2021.01.27 |
[백준] 16235번 - 나무 재테크 / C++ (0) | 2021.01.26 |
[백준] 16234번 - 인구 이동 / C++ (0) | 2021.01.26 |