본문 바로가기
알고리즘 문제풀이/백준

[백준 17140] 이차원 배열과 연산

by m2162003 2020. 12. 23.

www.acmicpc.net/problem/17140

 

17140번: 이차원 배열과 연산

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

www.acmicpc.net

map과 vector를 사용해서 풀었다.

 

1. row와 col 비교

row>= col이면 row따라

else 면 col따라 연산을 진행한다.

 

2. 연산

2-1. 연산을 진행할 때 등장횟수 측정을 위해 map을 사용했다. 

각 row/col마다 map으로 등장횟수를 측정하고 vector에 담아서 map을 소트했다.

vector<pair<int, int>> v(m.begin(), v.end());

 

2-2. map에 담는 과정에서 0이면 무시하고 넘어가야 하므로 

if arr[i][j] == 0이면 continue했다.

 

2-3. 한 row 혹은 col마다 연산을 진행하므로 모든 row/col의 연산이 끝난 후 다음 row와 col을 업데이트 해줘야 한다. 

row연산을 하면 col이 업데이트되고

col연산을 하면 row가 업데이트된다.

그래서 nc와 nr 변수를 만들어서 row와 col의 모든 연산이 끝난 후에 업데이트하는 식으로 구현했다.

#include <stdio.h>
#include <vector>
#include <map>
#include <algorithm>

using namespace std;
int r, c, k;
int row = 3, col = 3;
int nr = 3, nc = 3;

int arr[100][100];
map<int, int> m;

bool cmp(const pair<int, int> &a, const pair<int, int> &b)
{
  if (a.second == b.second)
  {
    return a.first < b.first;
  }
  return a.second < b.second;
}

void Rcal()
{
  for (int i = 0; i < row; i++)
  {
    m.clear();
    for (int j = 0; j < col; j++)
    {
      if (arr[i][j] == 0)
      {
        continue;
      }
      m[arr[i][j]]++;
      arr[i][j] = 0;
    }
    vector<pair<int, int>> v(m.begin(), m.end());
    sort(v.begin(), v.end(), cmp);

    int idx = 0;
    for (int j = 0; j < v.size(); j++)
    {
      arr[i][idx++] = v[j].first;
      arr[i][idx++] = v[j].second;
      if (idx == 100)
      {
        break;
      }
    }
    nc = max(idx, nc);
  }
  col = nc;
}

void Ccal()
{
  for (int j = 0; j < col; j++)
  {
    m.clear();
    for (int i = 0; i < row; i++)
    {
      if (arr[i][j] == 0)
      {
        continue;
      }
      m[arr[i][j]]++;
      arr[i][j] = 0;
    }
    vector<pair<int, int>> v(m.begin(), m.end());
    sort(v.begin(), v.end(), cmp);

    int idx = 0;
    for (int i = 0; i < v.size(); i++)
    {
      arr[idx++][j] = v[i].first;
      arr[idx++][j] = v[i].second;
      if (idx == 100)
      {
        break;
      }
    }
    nr = max(nr, idx);
  }
  row = nr;
}

void cal()
{
  if (row >= col)
  {
    Rcal();
  }
  else
  {
    Ccal();
  }
}

int main(void)
{
  scanf("%d%d%d", &r, &c, &k);
  r--;
  c--;

  for (int i = 0; i < 3; i++)
  {
    for (int j = 0; j < 3; j++)
    {
      scanf("%d", &arr[i][j]);
    }
  }

  int time = 0;
  while (1)
  {
    if (arr[r][c] == k)
    {
      break;
    }
    nr = 0, nc = 0;
    cal();
    time++;

    if (time == 101)
    {
      printf("-1\n");
      return 0;
    }
  }
  printf("%d\n", time);
  return 0;
}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 16236] 아기 상어  (0) 2020.12.26
[백준 1722] 순열의 순서  (0) 2020.12.25
[백준 1456] 거의 소수  (0) 2020.12.23
[백준 11051] 이항 계수 2  (0) 2020.12.23
[백준 2004] 조합 0의 개수  (0) 2020.12.23

댓글