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

[백준 19640] 화장실의 규칙

by m2162003 2020. 12. 28.

www.acmicpc.net/problem/19640

 

19640번: 화장실의 규칙

위와 같이 줄을 선 경우를 생각해보자. (x, y) 는 사원의 근무 일수가 x, 화장실이 급한 정도가 y임을 나타낸다. [x, y]는 해당 사원이 데카임을 의미한다. 즉, 위의 그림에서 데카는 3번 사원이다.

www.acmicpc.net

우선순위 큐를 사용하는 문제이다.

eazymean.tistory.com/99

 

[c++] STL priority_queue 우선순위 큐

c++ STL 중 하나인 우선순위 큐에 대해 알아보자. 큐와 동일하지만 안에서 정렬이 된다는 점이 다르다. - 헤더는 #include - 선언은 priority_queue<자료형, 구현체(container), 비교연산자(compare 함수)> pq  -..

eazymean.tistory.com

 

화장실 줄이 m개이고 각 줄의 맨 앞은 우선순위 조건에 따라 한명씩 화장실에 들어간다.

줄이 빠진 줄은 다음 줄에 서있던 사람이 줄을 채운다.

 

이 과정을 반복하는데 k번째 사람이 몇번째에 화장실에 들어가게 되는지에 대한 문제이다.

 

1. 화장실 문앞에 있는 m개 줄에 대해 우선순위 큐를 사용하여 pop한다.

2. pop한 사람이 k번째 사람이라면 -> break

3. 아니라면 해당 줄에 있던 사람을 채운다.

 

해당 줄에 있던 사람을 채우고 + tle가 나지 않기 위해 처음 구조체를 선언할때 row와 col정보를 저장한다.

구조체 벡터에 row와 col정보를 저장하여 해당 row의 col+1에 해당하는 사람을 우선순위 큐에 푸쉬한다.

 

#include <stdio.h>
#include <queue>
using namespace std;
int n, m, k;

struct p
{
  int idx, row, col, day, hurry;
};

bool operator<(const p &t1, const p &t2)
{
  if (t1.day == t2.day)
  {
    if (t1.hurry == t2.hurry)
    {
      return t1.row > t2.row;
    }
    return t1.hurry < t2.hurry;
  }
  return t1.day < t2.day;
}

// struct cmp
// {
//   bool operator()(p &t1, p &t2)
//   {
//     if (t1.day == t2.day)
//     {
//       if (t1.hurry == t2.hurry)
//       {
//         return t1.row > t2.row;
//       }
//       return t1.hurry < t2.hurry;
//     }
//     return t1.day < t2.day;
//   }
// };

priority_queue<p> pq;
vector<p> v[100000];
int main(void)
{
  scanf("%d%d%d", &n, &m, &k);
  for (int i = 0; i < n; i++)
  {
    int d, h;
    scanf("%d%d", &d, &h);
    int row = i % m;
    int col = i / m;
    v[row].push_back({i, row, col, d, h});
  }

  //pq 초기화
  int i = 0;
  for (i = 0; i < m; i++)
  {
    if (v[i].size() >= 1)
    {
      pq.push(v[i][0]);
    }
  }

  int cnt = 0;

  while (1)
  {
    p cur = pq.top();
    if (cur.idx == k)
    {
      break;
    }
    pq.pop();
    int row = cur.row;
    int col = cur.col;

    if (col < v[row].size() - 1)
    {
      pq.push(v[row][col + 1]);
    }
    cnt++;
  }

  printf("%d\n", cnt);
  return 0;
}

 

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

[백준 5545] 최고의 피자  (0) 2020.12.29
[백준 1477] 휴게소 세우기  (0) 2020.12.28
[백준 3079] 입국심사  (0) 2020.12.28
[백준 15810] 풍선 공장  (0) 2020.12.28
[백준 17451] 평행 우주  (0) 2020.12.27

댓글