컴퓨터 사이언스/1고리즘

백준 7568 : 덩치

저세상 개발자 2021. 9. 8. 19:51

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

 

7568번: 덩치

우리는 사람의 덩치를 키와 몸무게, 이 두 개의 값으로 표현하여 그 등수를 매겨보려고 한다. 어떤 사람의 몸무게가 x kg이고 키가 y cm라면 이 사람의 덩치는 (x, y)로 표시된다. 두 사람 A 와 B의 덩

www.acmicpc.net

 

N의 크기가 최대 50으로 매우 작으므로 브루트포스로 문제를 해결하면된다.

다만, 나는 N의 크기가 1만 그 이상이라고 생각하고 2차원 누적합을 문제를 해결했다.

 

로직은 다음과 같다.

 

1. weight와 height로 이루어진 2차원 누적합 배열을 만든다.

2. weight가 w, height가 h인 사람보다 순위가 높은 사람은 (w + 1, h + 1)부터 (weight max, height max)까지의 영역의 누적합과 같다. ( (w,h)보다 순위가 높은 사람은 모두 아래 초록색 영역에 포함된다.)

 

 

코드는 아래와 같다.

#include <iostream>

using namespace std;
using pii = pair<int, int>;

pii info[50];
int prefix_sum[201][201];

void solution() {
	int n, weight, height;
	cin >> n;

	for (int i = 0; i < n; i++) {
		cin >> weight >> height;
		info[i].first = weight, info[i].second = height;
		++prefix_sum[weight][height];
	}

	// 가로방향 누적합
	for (int i = 1; i <= 200; i++) {
		for (int j = 1; j <= 200; j++) {
			prefix_sum[i][j] += prefix_sum[i][j - 1];
		}
	}

	// 세로방향 누적합
	for (int i = 1; i <= 200; i++) {
		for (int j = 1; j <= 200; j++) {
			prefix_sum[j][i] += prefix_sum[j - 1][i];
		}
	}

	int max_range = 200;
	for (int i = 0; i < n; i++) {
		weight = info[i].first, height = info[i].second;
		cout << prefix_sum[max_range][max_range] - prefix_sum[max_range][height] 
			- prefix_sum[weight][max_range] + prefix_sum[weight][height] + 1 << '\n';
	}	
}

int main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	solution();

	return 0;
}
메모리: 2180 kb 시간: 0 ms