Problem Solving/BOJ(백준)

[BOJ]백준 17254번: 키보드 이벤트

이진2 2019. 6. 23. 16:03

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

 

17254번: 키보드 이벤트

첫째 줄에 연결된 키보드의 개수 N과, 키보드를 누르게 될 횟수 M이 주어진다. (1 ≤ N, M ≤ 1,000) 다음 M개의 줄에 정수 a, b와 문자 c가 주어진다. 이는 a번 키보드로, b초에 문자 c가 적힌 키를 누를 것이라는 의미이다. (1 ≤ a ≤ N, 0 ≤ b ≤ 1,000,000) 키보드에는 알파벳 대문자와 숫자키만 존재한다.

www.acmicpc.net

문제는 길지만, 정렬을 응용하여 풀 수 있는 간단한 문제였다

입력은 키보드 넘버 N, 키보드 입력 횟수 M과

각 M개의 입력에 대한 A번 키보드로 B초에 문자 C가 적힌 키를 누를 때, 화면에 출력될 글자는?

우선순위는 시간>키보드번호(오름차순)이다.

정렬할 때 고려해야 할 사항이 두 가지 이상일 때, 정렬 비교 함수 cmp 작성 능력을 기르기 좋은 문제인듯

일단 세 변수를 한번에 저장할 수 있는 구조체 S를 선언,

 

1. 정렬하는데 필요한 자료형 변수 두 개를 받아온다

2. 우선순위가 높은 멤버부터 먼저 써줌

3. 반환할 때는 오름차순일 경우 < (오른쪽<왼쪽), 내림차순일 경우 > (왼쪽>오른쪽)

#include <cstdio>
#include <algorithm>
using namespace std;
struct s { int a, b; char c; };
bool cmp(s k1, s k2) {
	if (k1.b != k2.b)return k1.b < k2.b;
	return k1.a < k2.a;
}
int main() {
	int n, m;
	scanf("%d%d", &n, &m);
	s* key = (s*)malloc(sizeof(s)*m);
	for (int i = 0; i < m; i++)scanf("%d%d %c", &key[i].a, &key[i].b, &key[i].c);
	sort(key, key + m, cmp);
	for (int i = 0; i < m; i++)printf("%c", key[i].c);
	return 0;
}

 

정렬한 뒤 그대로 출력하면 끝!