매일 BOJ
(매일 BOJ) C++ 7568번 덩치
norepinephrine
2025. 7. 11. 00:10
이번 문제는 실버 5 난이도의 7568번 덩치문제이다.

문제의 접근법부터 살펴보자.
입력이 X Y의 형태로 N개 주어지기 때문에, 2차원 배열을 이용해야 함을 알 수 있다.
그리고 문제에서 힌트를 준 것을 잘 살펴보면, 브루트포스를 사용하여 완전탐색을 한 후 자기 자신보다 큰 값이 몇개인지를 카운트 하고 이를 바로바로 ' '로 출력하면 됨을 볼 수 있다.
시간제한이 1초 (연산 100,000,000회), N이 최대 50이며, for 반복문 3회 O(n^3) 50^3 의 연산을 2회 50^3*2 진행하니, 대략 계산해보면 50*50*50*2 최대 250,000번의 연산이 진행되는 것을 볼 수 있으며 따라서 vector 를 사용해도 TLE 가 발생하지 않는 것을 쉽게 알 수 있을 것이다.
아래는 작성한 코드이다.
#include <bits/stdc++.h>
using namespace std;
int main (void){
ios::sync_with_stdio(0); cin.tie(0);
int N;
cin >> N;
vector<vector<int>> list(N, vector<int>(2));
for (int i = 0; i < N; i++){
for (int j = 0; j < 2; j++){
cin >> list[i][j];
}
}
for (int i = 0; i < N; i++){
int r = 1;
for(int j = 0; j < N; j++){
if (list[i][0] < list[j][0] && list[i][1] < list[j][1]) r++;
}
cout << r << " ";
}
}
다른 사람이 작성한 코드를 보면 pair 을 사용하면 2차원 백터를 만들지 않고도 해결할 수 있는 것을 알 수 있다.
#include <iostream>
#include <utility>
using namespace std;
int main() {
int num;
int rank = 1;
pair<int,int> arr[50];
cin >> num;
for(int i = 0; i < num; i++)
cin >> arr[i].first >> arr[i].second;
for(int i = 0; i < num; i++)
{
for(int j = 0; j < num; j++)
if(arr[i].first < arr[j].first && arr[i].second < arr[j].second)
rank++;
cout << rank << ' ';
rank = 1;
}
}