백준 7568번 - 덩치

Updated:

C++

7568번 - 덩치

문제

학생 N명의 몸무게와 키가 담긴 입력을 읽어서 각 사람의 덩치 등수를 계산하여 출력하는 문제 출처

초기 접근 및 실패

처음에 pair<몸무게, 키>를 통해 몸무게를 기준으로 내림차순으로 정렬 한 뒤, 졍렬한 기준에서 키가 바로 위의 사람과 비교하여 더 작을시 덩치 등수를 계산하는 방법으로 구현을 하였습니다. 하지만 이는 반례가 존재하는데,

| input |output|answer|
|-------|------|------|
|170 75	|  1   |  1   |
|130 16	|  3   |  3   |
|180 75	|  1   |  1   |
|120 156|  3   |  1   |
|49 24  |  5   |  4   | 

보시는 것과 같이, OutPut과 실제 답이 다른 것을 알 수 있습니다. 이는, 위의 예에서, 몸무게 순으로 정렬을 하면,

180 75	1
170 75	1
130 16	3
120 156	3
49 24	5

가 된다. 이는 4번째의 (120, 156)인 사람이 (130, 16)인 사람과 비교를 하기 때문입니다. 또한 (49,24)는 (130, 16)과 비교를 할 수 없어 4가 되어야 하지만, 위의 알고리즘으로는 (120,156)과 비교를 하게 되어 5가 됩니다.

접근 방법 및 구현

간단히 완전 탐색으로 생각 하되, 자신 보다 덩치가 큰 사람이 발견시 자신의 순번을 올리는 방식으로 구현을 하면 된다.

코드

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int n;
vector<pair<pair<int, int>,int>> man;	//pair 내부의 pair를 통해 몸무게, 키, 순번을 저장할 vector를 선언한다.
int a, b;

int main() {

	ios::sync_with_stdio(false);
	cin.tie(NULL);
	
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a;
		cin >> b;
		man.push_back(make_pair(make_pair(a, b),1));	//초기 순번은 다 1이다.
	}
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (i == j)
				continue;
			//만일 자신보다 덩치가 큰 사람이 존재 할 시, 자신의 순번을 1올린다.
			if (man.at(i).first.first < man.at(j).first.first && man.at(i).first.second < man.at(j).first.second) {
				man.at(i).second++;
			}
		}
	}


	for (int i = 0; i < n; i++) {
		cout << man.at(i).second << " ";
	}
	cout << "\n";
	
	return 0;
}

후기 및 개선할 점

후기: 집중!