본문 바로가기
알고리즘/프로그래머스

알고리즘(C++) / 프로그래머스 위클리 챌린지 6주차 : 복서 정렬하기

by clean_h 2021. 9. 14.
728x90

위클리 챌린지 6주차 : 복서 정렬하기

https://programmers.co.kr/learn/courses/30/lessons/85002?language=cpp 

 

코딩테스트 연습 - 6주차_복서 정렬하기

복서 선수들의 몸무게 weights와, 복서 선수들의 전적을 나타내는 head2head가 매개변수로 주어집니다. 복서 선수들의 번호를 다음과 같은 순서로 정렬한 후 return 하도록 solution 함수를 완성해주세요

programmers.co.kr

 

코드

//프로그래머스 6주차 복서 정렬하기
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

struct Person
{
    int num = 0; //자신 번호
    int weight = 0; //자신 몸무게
    vector<int> win; //이긴 사람
    vector<int> win_heavy;
    vector<int> lose; //진 사람
    double rate = 0; //승률
};

bool cmp(Person& a, Person& b) {
    if (a.rate == b.rate) {
        if (a.win_heavy.size() == b.win_heavy.size()) {
            if (a.weight == b.weight)
                return a.num < b.num; //번호 순
            return a.weight > b.weight; //자신 몸무게 순
        }
        return a.win_heavy.size() > b.win_heavy.size(); //자신보다 몸무게가 무거운 복서 많은 순
    }
    return a.rate > b.rate; //승률 순
}

vector<int> solution(vector<int> weights, vector<string> head2head) {
    vector<int> answer;
    vector<Person> people;

    for (int i = 0; i < weights.size(); i++) {
        Person p;
        p.num = i + 1;
        p.weight = weights[i];
        for (int j = 0; j < weights.size(); j++) {
            //이긴 사람
            if (head2head[i][j] == 'W') {
                p.win.push_back(weights[j]);
                if (weights[i] < weights[j])
                    p.win_heavy.push_back(weights[j]);
            }
            //진 사람
            if (head2head[i][j] == 'L')
                p.lose.push_back(weights[j]);
        }
        if(p.win.size() != 0)
            p.rate = (double)p.win.size() / (double)(p.win.size() + p.lose.size()); //승률 구하기

        people.push_back(p);
    }

    sort(people.begin(), people.end(), cmp); //정렬

    for (auto p : people) {
        answer.push_back(p.num);
    }

    return answer;
}

int main() {
    vector<int> weights = { 145,92,86 };
    vector<string> head2head = { "NLW","WNL","LWN" };
    solution(weights, head2head);
    return 0;
}

 

설명

Person 구조체를 다음과 같이 선언한다. 

한사람당 번호, 무게, 이긴사람, 이긴사람 중 자신보다 무게가 많이 나가는 사람, 진사람, 승률을 구하여 구조체를 만들어 벡터에 저장한다. 

승률순 -> 자신보다 몸무게가 무거운 복서 많은 순 -> 몸무게 순 -> 번호 순 으로 정렬한다. 

 

고찰

걸린시간 : 50분

정렬하는 기준에서 말이 조금 어려워 하나씩 차근차근 읽어가면서 정렬 기준을 확인하면서 cmp 함수를 구현할 수 있었다. 

 

728x90

댓글