https://www.acmicpc.net/problem/7568
7568번: 덩치
우리는 사람의 덩치를 키와 몸무게, 이 두 개의 값으로 표현하여 그 등수를 매겨보려고 한다. 어떤 사람의 몸무게가 x kg이고 키가 y cm라면 이 사람의 덩치는 (x, y)로 표시된다. 두 사람 A 와 B의 덩
www.acmicpc.net
풀이 :
- 각 사람보다 몸무게와 키가 더 큰 사람이 몇 명인이 센 후 그 수+1이 등수가 된다
- 무게가 큰 순, 같다면 키가 큰 순으로 정렬을 해두고 1<j까지 비교하면서 카운트를 해주고, 등수를 매겨줬다
- 다시 인덱스, 순으로 정렬해주고 출력했다
- 굳이 정렬하지 않고 카운트 해도 되지만 내가 이해하기 편해서 정렬을 해주었다
코드 :
#include <iostream>
#include <algorithm>
using namespace std;
struct info{
int index;
int weight;
int height;
int rank;
};
void sortinfo(info *arr, int n){ // 무게가 큰 순, 같다면 키가 큰 순으로 정렬
for(int i=1; i<=n; i++){
for(int j=i+1; j<=n; j++){
if(arr[i].weight < arr[j].weight){
swap(arr[i],arr[j]);
}else if(arr[i].weight == arr[j].weight){
if(arr[i].height < arr[j].height){
swap(arr[i],arr[j]);
}
}
}
}
}
void sortinfo2(info *arr, int n){ // 인덱스 순으로 정렬
for(int i=1; i<=n; i++){
for(int j=i+1; j<=n; j++){
if(arr[i].index > arr[j].index){
swap(arr[i],arr[j]);
}
}
}
}
int main(){
int n, cnt;
info info[55];
cin >> n;
for(int i=1; i<=n; i++){
info[i].index = i;
cin >> info[i].weight >> info[i].height;
}
sortinfo(info, n);
info[1].rank = 1;
for(int i=2; i<=n; i++){
cnt = 0;
for(int j=1; j<i; j++){
if(info[j].weight > info[i].weight && info[j].height > info[i].height){
cnt++; //현재 인덱스의 무게와 키보다 더 큰 경우 카운트
}
}
info[i].rank = cnt+1;
}
sortinfo2(info, n);
for(int i=1; i<=n; i++){
cout << info[i].rank << ' ';
}
cout << endl;
}
- 인덱스, 무게, 키, 순위를 넣을 구조체 선언
- 입력 받으면서 인덱스, 무게, 키 값 넣어준다
- 무게 순으로 정렬
- info[1]의 경우 무조건 1등이기 때문에 값 넣어주고 for문은 2부터 시작
더 큰 값을 찾아서 카운트 하고, 순위 값 넣어준다
- 인덱스 순으로 다시 정렬 후 출력
후기 :
순위 매기는 부분을 잘못 생각해서 여러번 틀렸었다.
단순히 바로 이전 값만 비교하기도 했고, 이전 값과 비교해서 순위에 변동이 생기면 그 값을 중심으로 비교하기도 했다.
여러번 틀린 후 다시 문제를 찬찬히 읽었고 내가 잘못 생각했다는 것을 알아차렸다.
예제가 그런 점을 노린게 아닌가 싶기도 하다.
아무튼 나의 잘못이니 문제에서 요구하는 바를 잘 파악할 것! 문제를 잘 읽자!
'PS_Baekjoon' 카테고리의 다른 글
[백준 C++] 1316번 : 그룹 단어 체커 (1) | 2023.02.28 |
---|---|
[백준 C++] 1439번 : 뒤집기 (0) | 2023.02.27 |
[백준 C++] 10815번 : 숫자 카드 (0) | 2023.02.25 |
[백준 C++] 11866번 : 요세푸스 문제 0 (0) | 2023.02.25 |
[백준 C++] 10814번 : 나이순 정렬 (0) | 2023.02.24 |