반응형

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

 

1713번: 후보 추천하기

첫째 줄에는 사진틀의 개수 N이 주어진다. (1 ≤ N ≤ 20) 둘째 줄에는 전체 학생의 총 추천 횟수가 주어지고, 셋째 줄에는 추천받은 학생을 나타내는 번호가 빈 칸을 사이에 두고 추천받은 순서대

www.acmicpc.net

 

배열을 이용한 구현문제였습니다.

이미 사진틀에 채워진 학생이면 추천수를 증가시키고,

그게 아니라면, 빈 공간 또는 삭제 가능한 위치를 찾아줬습니다.

#include <cstdio>
int n, m, k, idx;
int p[20][3] = { 0, }; // 학생번호, 추천수, 게시 시점
int findEmptySpace() {
	for (int i = 0; i < n; i++)
		if (p[i][0] == 0) return i;
	return -1;
}

int isFilled(int k) {
	for (int i = 0; i < n; i++)
		if (p[i][0] == k) return i;
	return -1;
}

int findDeletableSpace() {
	int idx = 0;
	for (int i = 1; i < n; i++)
		if (p[i][1] < p[idx][1]) idx = i;
	for (int i = 0; i < n; i++)
		if (p[i][1] == p[idx][1] && p[i][2] < p[idx][2]) idx = i;
	return idx;
}

void qsort(int l, int r) {
	if (l >= r) return;
	int s = l - 1;
	int e = r + 1;
	int pv = p[(s+e)/2][0];
	while (1) {
		while (p[++s][0] < pv);
		while (p[--e][0] > pv);
		if (s >= e) break;
		int temp = p[s][0];
		p[s][0] = p[e][0];
		p[e][0] = temp;
	}
	qsort(l, s - 1);
	qsort(e + 1, r);
}
int main() {
	scanf("%d %d", &n, &m);
	for (int i = 0; i < m; i++) {
		scanf("%d", &k);
		idx = isFilled(k);
		if (idx != -1) p[idx][1]++;
		else {
			idx = findEmptySpace();
			if (idx == -1) idx = findDeletableSpace();
			p[idx][1] = 1;
			p[idx][0] = k;
			p[idx][2] = i;
		}
	}
	qsort(0, n - 1);
	for (int i = 0; i < n; i++) printf("%d ", p[i][0]);
}
반응형

'Algorithm' 카테고리의 다른 글

백준 6137 : 문자열 생성  (0) 2021.11.11
백준 15501 : 부당한 퍼즐  (0) 2021.11.11
백준 2866 : 문자열 잘라내기  (0) 2021.11.11
백준 10546 : 배부른 마라토너  (0) 2021.11.11
백준 1700 : 멀티탭 스케줄링  (0) 2021.11.11

+ Recent posts