Kiki Devlog

[7568번][실5] 덩치 본문

Coding Test/백준

[7568번][실5] 덩치

kimkiki 2022. 3. 5. 19:47
728x90

이 문제를,,,괜히 deque를 사용해서 풀려는 오기를 부리다가 몇시간을 날렸다. tc는 모두 통과되고 반례유명 예시들도 통과했는데 왜 틀렸다고 나오는지 모르겠어서 어제 잠자고, 오늘 다시 처음부터 쉬운방법으로 코딩했다ㅠ

 

브루트 포스 문제는 심플하게 하나씩 다 뒤져보는게 베스트인 걸로..

 

내 코드

#include <iostream>
#include <vector>

using namespace std;

int main() {
	int weight;
	int height;
	int personNum;

	vector<int> rankAry;
	vector<pair<int, int >> personAry;

	cin >> personNum;
	
	/*사람 정보 입력받기*/
	for (int i = 0; i < personNum; i++) {
		cin >> weight >> height;
		personAry.push_back(make_pair(weight, height));
		rankAry.push_back(1);
	}

	/*브루트 포스로 등수 비교*/
	for (int i = 0; i < personNum; i++) {
		for (int j = i+1; j < personNum; j++) {
			if (personAry[i].first > personAry[j].first) {
				if (personAry[i].second > personAry[j].second) {
					rankAry[j]++;
				}
			}
			else if (personAry[i].first < personAry[j].first) {
				if (personAry[i].second < personAry[j].second) {
					rankAry[i]++;
				}
			}
		}
	}

	
	/*정답 출력*/
	for (int i = 0; i < rankAry.size(); i++) {
		cout << rankAry[i]<< " ";
	}

	return 0;
}

 

 

 

 

왜 틀린지 모르겠는 어제 코드,,,,

더보기

(왜틀렸는지 너무 알아내고 싶어서 나중에 다시 볼거임)

#include <iostream>
#include <deque>

using namespace std;

typedef pair<int, int> Person;//한 사람의 정보
deque <pair<int, Person>> rankAry; //한 등수에 여러명 담을 수 있는 등수 배열

/* 새 사람보다 낮은 등수의 사람들을 한등수씩 뒤로 미룸 */
void  MinusRank(int newPersonRank) {
	for (int i = 0; i < rankAry.size(); i++) {
		if (rankAry[i].first >= newPersonRank) {
			rankAry[i].first++;
		}
	}
}

int main() {
	int weight;
	int height;
	int personNum;
	bool isSerchingUp = false;
	bool isSerchingDown = false;
	cin >> personNum;

	for (int i = 0; i < personNum; i++) {
		cin >> weight >> height;

		Person newPerson;
		newPerson = make_pair(weight, height);

		if (rankAry.size() == 0) {
			rankAry.push_back({ 1, newPerson });//{weight, height}   // make_pair(값1, 값2)
			continue;
		}

		for (int j = 0; j < rankAry.size(); j++) {
			Person personInfo = rankAry[j].second;
			int personRank = rankAry[j].first;

			if (weight > personInfo.first) { //몸무게 큼
				if (height > personInfo.second) {
					if ((personRank == 1)|| isSerchingDown) {//1등이라면
						MinusRank(personRank);
						rankAry.push_back({ personRank ,newPerson });
						break;
					}

					//비교대상이 1등이 아니면 for 문 더 반복해서 올라갈 수 있는 최대 등수를 찾기.
				}
				else { //등수 같음
					MinusRank(personRank + 1);
					rankAry.push_back({ personRank, newPerson });
					break;
				}
				isSerchingUp = true;
			}
			else if (weight == personInfo.first) { //몸무게 같음(=등수 같음)
				MinusRank(personRank + 1);
				rankAry.push_back({ personRank, newPerson });
				break;
			}
			else {//몸무게 작음
				if (height >= personInfo.second) {//등수 같음
					MinusRank(rankAry[j].first + 1);
					rankAry.push_back({ personRank ,newPerson });
					break;
				}
				else if ((j == (rankAry.size() - 1)) || isSerchingUp){//꼴지라면
					rankAry.push_back({ rankAry.size() + 1, newPerson });
					break;
				}
				isSerchingDown = true;
				//더 낮은 등수면 for문 더 돌면서 보기.
			}
		}
		isSerchingDown = false;
		isSerchingUp = false;
	}

	for (int k = 0; k < rankAry.size(); k++) {
		cout << rankAry[k].first << " ";
	}

	return 0;
}

 

Comments