본문 바로가기

PS_Baekjoon

[백준 C++] 7568번 : 덩치

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부터 시작

    더 큰 값을 찾아서 카운트 하고, 순위 값 넣어준다

- 인덱스 순으로 다시 정렬 후 출력

 

후기 :

순위 매기는 부분을 잘못 생각해서 여러번 틀렸었다.

단순히 바로 이전 값만 비교하기도 했고, 이전 값과 비교해서 순위에 변동이 생기면 그 값을 중심으로 비교하기도 했다.

여러번 틀린 후 다시 문제를 찬찬히 읽었고 내가 잘못 생각했다는 것을 알아차렸다.

예제가 그런 점을 노린게 아닌가 싶기도 하다.

아무튼 나의 잘못이니 문제에서 요구하는 바를 잘 파악할 것! 문제를 잘 읽자!