알고리즘/구현

백준 - 12764 싸지방에 간 준하

2024. 4. 2. 09:31
목차
  1. 문제
  2. 문제 풀이

문제

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

 

12764번: 싸지방에 간 준하

첫째 줄에 사람의 수를 나타내는 \(N\)이 주어진다. \((1 \le N \le 100,000)\) 둘째 줄부터 \(N\)개의 줄에 걸쳐서 각 사람의 컴퓨터 이용 시작 시각 \(P\)와 종료 시각 \(Q\)가 주어진다. \((0 \le P \lt Q \le 1,000

www.acmicpc.net

모든 사람은 비어있는 자리 중 번호가 가장 작은 자리에 앉아야 한다.

다음과 같은 이용 규칙으로 모든 사람이 기다리지 않는 컴퓨터의 최소 개수와 자리별로 몇 명의 사람이 사용했는가를 구하는 문제였다.

 

문제 풀이

처음에 비어있는 자리 중 번호가 가장 작은 자리에 앉는다는 규칙을 제대로 보지 않아서 틀렸었다. 해당 규칙을 지키도록 로직을 수정해 맞을 수 있었다.

 

먼저 시작 시각을 기준으로 오름차순 정렬을 했다. 그후 모든 사람을 PQ에 넣으면서 각 자리를 비우고 채우는 과정을 반복해 각 자리의 사람 수를 구할 수 있었다.

 

PQ는 해당 자리의 종료 시간을 저장한 pair PQ와 빈 자리 번호를 저장한 PQ 2개를 사용했다.

 

해당 과정은 다음과 같이 진행했다.

1. 현재 시작 시각보다 종료 시간이 빠른 자리를 모두 비운다.

해당 자리의 번호를 빈 자리 번호 pq에 저장한다. 이때 pq를 사용했기 때문에 오름차순으로 정렬된다.

 

2. 빈 자리가 있다면 해당 자리에 넣는다.

현재 종료 시간과 해당 자리 번호를 pq에 넣어주고 빈 자리 pq에서 해당 자리 번호를 빼준다.

 

3. 빈 자리가 없다면 맨 뒤에 넣는다.

빈 자리 pq가 비어있다면 pq에 현재 종료 시간과 컴퓨터 배열의 크기를 저장한 comSize를 함께 넣어준 후 comSize를 1 늘려준다.

 

자리에 넣을 때마다 computer 배열의 해당 자리 index 값을 1 늘려줘 몇 명의 사람이 사용했는지를 구할 수 있었다.

/*
1. 시작 시각 기준 오름차순 정렬
2. PQ 사용, {종료 시간, computer num} 해당 num에 넣을 때마다 ++
3. 빈 자리 중 컴퓨터 번호 가장 작은 자리에 앉는 것이 규칙
- pq에 빈 번호 저장
*/
int N;
vector<pair<int, int>> arr;
vector<int> computer;
priority_queue<pair<int, int>, vector<pair<int,int>>, greater<pair<int,int>>> pq; //종료 시간, computer num
priority_queue<int, vector<int>, greater<int>> numPq; //빈자리
int comSize = 0;
int main() {
scanf("%d", &N);
arr = vector<pair<int, int>>(N);
computer = vector<int>(N, 0);
for (int i = 0; i < N; i++) {
int s, e;
scanf("%d %d", &s, &e);
arr[i] = { s,e };
}
sort(arr.begin(), arr.end());
for (int i = 0; i < N; i++) {
int nowStartTime = arr[i].first;
int nowEndTime = arr[i].second;
//1. 현재 시작 시각보다 빠른 종료 시간 가진 자리 비우기
while (!pq.empty() && pq.top().first < nowStartTime) {
numPq.push(pq.top().second);
pq.pop();
}
//2. 빈 자리가 있다면 바로 넣기
if (!numPq.empty()) {
int n = numPq.top();
numPq.pop();
pq.push({ nowEndTime, n });
computer[n]++;
}
//3. 빈 자리가 없다면 맨 뒤에 넣기
else {
pq.push({ nowEndTime, comSize });
computer[comSize]++;
comSize++;
}
}
printf("%d\n", comSize);
for (int i = 0; i < comSize; i++) {
printf("%d ", computer[i]);
}
return 0;
}
/*
*/
  1. 문제
  2. 문제 풀이
'알고리즘/구현' 카테고리의 다른 글
  • 백준 - 26086 어려운 스케줄링
  • 백준 - 24461 그래프의 줄기
  • 백준 - 16236 아기상어
  • 백준 - 17144 미세먼지 안녕!
hahihi
hahihi
hahihi
히호 노트
hahihi
전체
오늘
어제
  • 분류 전체보기 (224)
    • 알고리즘 (114)
      • 정렬 (3)
      • 그리디 (9)
      • 구현 (35)
      • 이분 탐색 (4)
      • 탐색 (2)
      • 동적 계획법 (DP) (11)
      • DFS BSF (29)
      • 최단 경로 (5)
      • 그래프 (4)
      • 주의할 점 (4)
      • 트리 (3)
    • spring (34)
      • JPA (12)
    • DevOps (10)
      • Docker (3)
    • java (15)
      • 이펙티브자바 (4)
      • Clean Code (4)
    • git (9)
    • DB (3)
    • 앱개발 (1)
    • 유닉스 (26)
    • 네트워크 (3)
      • IT 엔지니어를 위한 네트워크 입문 (3)
    • 유니티 (1)
    • 후기 (4)
    • 누누코코 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 공통 response
  • 팀 결성
  • dp
  • SWEA
  • BaseEntity
  • allowPublicKeyRetrieval
  • 도넛과 막대 그래프
  • 이코테
  • 숫자 조각
  • 백준
  • spring
  • 13265
  • 1868
  • JWT
  • 7465
  • 입출력
  • 그리디 알고리즘
  • Docker
  • 프로그래머스
  • 4193

최근 댓글

최근 글

hELLO · Designed By 정상우.
hahihi
백준 - 12764 싸지방에 간 준하
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.