ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Matching System - 파티원 조직
    Algorithm with C/ETC 2020. 9. 12. 23:21

    1. 문제

    2. 문제 해결 전에 해야할 것

    의 문제를 해결 하기 전에 다음과 같은 문제에 대한 답을 해보자.

    아래와 같이 숫자들이 정의되어있다고 하자.

     1, 4, 7, 2, 5, 8, 3, 6, 9, 10, 11 

    첫 번째 그룹  11  10  1

    두 번째 그룹   9    8  5

    세 번째 그룹   7    6  4  3  2

     

    위와 같이 3개의 그룹이 있으며, 각 그룹에 위와 같이 값들이 저장되어있다고 하자.

     

    그러면, 위의 그룹의 특징이 눈에 보이는가?

    1그룹의 숫자 합 = 2그룹 숫자 합 = 3그룹 숫자 합

    임을 알 수 있다.

    ​각 그룹의 각 각의 합은 22이다.

     

    그리고, 위의 숫자의 총합은 66이다. (1부터 11까지의 합이므로.)

    숫자 총합 / 3 = 22

    위와 같은 프로그램을 작성해보자.

    힌트는 아래와 같다.

    1. 숫자의 총합은 66이며, 만약 숫자의 총합이 3의 배수가 아니라면

       그냥 프로그램을 종료시킨다.

    2. 위의 숫자들을 먼저 내림차순 정렬을 해야 한다. 

      정렬방식은 Quicksort방식을 이용하자.

       퀵 정렬은 앞에서 한 것을 그대로 가지고 오는데 기존의 방식은 오름 차순으로 만들어 진 것인데

      이를 내림 차순으로 바꾸도록 하자. 부호만 바꾸면 된다.

    3. 각 그룹당 가지고 있는 숫자들은 링크드 리스트로 관리. (Hash table의 개념)

     

    위의 내용을 구현해보자.

    아래의 함수는 연결 리스트의 역순을 바꾸는 내용을 참고하자.

    그리고 아래는 퀵 정렬의 Partition 함수에서 수정한 내용이다.

    프로그램 실행결과

    헤더 파일 & 소스 파일

    main.c
    0.00MB
    MyQuickSort.c
    0.00MB
    MyQuickSort.h
    0.00MB

     

    3. 구현 전에 생각해볼 것들

    여기에서는 총 3개의 정렬함수가 필요하다.

    첫 번째로, 점수를 내림 차순, 오른 차순으로 정렬할 함수 2개가 필요하며

    그리고, 자기 점수를 기준으로 정렬할 함수가 필요하다.

     

    SettingUser함수에서 유저들에 대한 정보를 입력하는데,

    가장 눈 여겨 봐야할 곳은 Score변수이다.

    Score 변수를 상당히 특이하게 받는 것을 알 수 있는데, 그 이유는

    나름의 점수 분포도를 고르게 하려는 목적과 위의 문제의 입력 부분에서 각 그룹들이 모여있는

    점수 범위에 맞추기 위한 목적까지 생각한 것이다.

     

    그리고 SetParty 함수가 가장 중요하다.

    이 함수에서 하는 역할을 큰 그림으로 설명하면

    5명을 뽑아야 하는데, 현재 그룹에 속한 그룹멤버가 5명을 초과할 경우, 딱 5명일 경우

    그리고 5명 미만인 3가지 경우가 있다.

    그 경우의 수를 쪼개자.

     

    1. 5명을 초과하는 경우

      이 중에서 5명을 뽑아내면 되는데, 먼저 자기 점수를 기준으로 정렬을 하고나서

      5명을 차례로 뽑아내면 된다.

     

    2. 5명일 경우

       생각할 필요 없이 5명을 뽑으면 된다.

     

    3. 5명 미만일 경우

       좀 복잡하다.  먼저, 현재 그룹에 속한 멤버들을 다 뽑아낸다.

       다시 멤버를 뽑아야 하는데, 어느 그룹에서 멤버를 뽑아야할지 생각해야 한다.

       멤버를 뽑는 규칙은 아래와 같다.

    위 그림과 같이 현재 플레이어가 속한 그룹이 5번이라고 한다면, 5번에 속한 그룹의 멤버들을 모두 뽑아낸다.

    그리고 나서 플레이어 보다 높은 점수를 가진 그룹으로 이동해서 멤버를 뽑아낸다.

    (즉, 6번 인덱스 그룹에서 멤버를 뽑는다.)

    멤버를 뽑아낸 이후에 다시 더 멤버를 뽑아야 하는 상황이 되면 이번에는 현재 플레이어가 속한 그룹보다 

    낮은 점수를 가진 그룹인 4번 인덱스 그룹에서 멤버를 뽑아낸다.

    그리고, 다시 멤버를 또 뽑아야 한다면 현재 플렝이어가 속한 그룹보다 높은 점수를 가진 그룹인

    7번 그룹에 가서 멤버를 뽑고 다시 멤버를 뽑을 경우에는 3번 인덱스 그룹으로 가서 멤버를 뽑는 방식으로 한다.

    즉. 플레이어가 속한 그룹 인덱스를 중심으로 오른쪽 왼쪽으로 반복적으로 인덱스를 탐색해나가면서

    멤버들을 뽑는다.  

     

    4. 필요한 구조체 정의

    < MyStructInfo.h >

     

    5. 구현에 필요한 기본적인 함수

    스코어(정수)의 자리 수를 세 자리씩 끊어서 콤마를 찍는 함수

    여기서는 금액이 아닌 스코어를 표현한다.

    designatedroom87.tistory.com/88?category=885723

     

    ItoA

    1. ItoA 함수 사용 방법 ItoA함수는 visual studio 2019 community에서는 에러가 난다. 그 대신 sprintf함수를 이용해서 이를 대체할 수 있다. 밑에서는 기존에 쓰던 ItoA 함수를 구현할 것이다. 프로그램 실행��

    designatedroom87.tistory.com

    아래의 세 함수들은 정렬하는 함수들로 bubble 정렬을 기본으로 구현한다.

    이 세 함수는 MySort 헤더 파일과 소스 파일에 정의한다.

     

    6. 구현 (각 그룹들의 정보를 초기화하고 유저들의 설정까지)

    프로그램 실행결과

    헤더 파일 & 소스 파일

    main.c
    0.01MB
    MySort.c
    0.00MB
    MySort.h
    0.00MB
    MyStructInfo.h
    0.00MB

     

    7. 구현 (나머지)

    SetParty함수를 구현해보자.

    SetPartyUser함수는 그룹에서 찾은 유저를 매칭하는 함수

    DisplayParty함수는 파티에 매칭된 유저들의 정보를 출력하는 함수

    아래는 메인 함수

    프로그램 실행결과

    헤더 파일 & 소스 파일

    main.c
    0.01MB
    MySort.c
    0.00MB
    MySort.h
    0.00MB
    MyStructInfo.h
    0.00MB

    'Algorithm with C > ETC' 카테고리의 다른 글

    비트 연산자 문제  (0) 2020.10.17
    달팽이 배열  (0) 2020.09.21
    통신 연구소  (0) 2020.09.09
    Catalan Number  (0) 2020.09.08
    Self-number  (0) 2020.09.07

    댓글

Designed by Tistory.