[백준] 27985 멘토링 매칭

2024. 6. 7. 11:55· Algorithm/stable marriage problem
목차
  1. 해설
  2. 코드

Backjoon

해설

gale-shapley 알고리즘을 기반으로 하고 있으나 쌍이 주어지지 않는다. 중요한 포인트는 다음 부분이다.

 

즉 선호도 테스트 케이스가 다음과 같이 주어지면

5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5

 

카이스트 학생들의 선호도는 다음과 같이 나와야 한다. 

5 4 3 2 1
5 4 1 3 2
1 5 2 4 3
1 2 3 5 4
1 2 3 4 5

 

따라서, 저 조건에 맞에 카이스트 학생들의 선호도를 만들어준 후 gale-shapley 알고리즘을 사용하면 풀 수 있다. 필자는 다음과 같이 구현했다.

for i in range(1, n+1):
    temp = [i]
    for dist in range(1,n):
        for j in range(n, 0, -1):
            if abs(i-j) == dist:
                temp.append(j)
    kaist_pref.append(temp[::-1])

 

코드

import sys
input = sys.stdin.readline

n = int(input())
person_pref = [list(map(int, input().split())) for _ in range(n)]
kaist_pref = []

for i in range(1, n+1):
    temp = [i]
    for dist in range(1,n):
        for j in range(n, 0, -1):
            if abs(i-j) == dist:
                temp.append(j)
    kaist_pref.append(temp[::-1])

def stable_marriage(men_preferences, women_preferences):
    n = len(men_preferences)
    free_men = list(range(n))
    women_partners = [None] * n 
    men_next_proposal = [0] * n 
    men_partners = [None] * n
    
    women_rankings = []
    for wp in women_preferences:
        ranking = [0] * n
        for i, man in enumerate(wp):
            ranking[man - 1] = i
        women_rankings.append(ranking)
    
    while free_men:
        man = free_men.pop(0)
        woman_index = men_next_proposal[man]
        woman = men_preferences[man][woman_index] - 1
        men_next_proposal[man] += 1
        
        if women_partners[woman] is None:
            women_partners[woman] = man
            men_partners[man] = woman
        else:
            current_partner = women_partners[woman]
            if women_rankings[woman][man] < women_rankings[woman][current_partner]:
                women_partners[woman] = man
                men_partners[man] = woman
                free_men.append(current_partner)
            else:
                free_men.append(man)
    
    return [w + 1 for w in men_partners]

matches = stable_marriage(person_pref, kaist_pref)
print(*matches)
저작자표시 (새창열림)

'Algorithm > stable marriage problem' 카테고리의 다른 글

매칭은 어떻게 구현할까? (안정 결혼 문제, 매칭 알고리즘)  (1) 2024.06.09
[백준] 20009 형곤이의 소개팅  (0) 2024.06.07
[백준] 12022 짝  (0) 2024.06.07
[백준] 9002 Match Maker  (0) 2024.06.07
[백준] 3761 The Stable Marriage Problem  (2) 2024.06.07
  1. 해설
  2. 코드
'Algorithm/stable marriage problem' 카테고리의 다른 글
  • 매칭은 어떻게 구현할까? (안정 결혼 문제, 매칭 알고리즘)
  • [백준] 20009 형곤이의 소개팅
  • [백준] 12022 짝
  • [백준] 9002 Match Maker
marsboy
marsboy
IF YOU LET ME BE THE CODE
marsboy
PAINT THE WORLD
marsboy
전체
오늘
어제
  • 분류 전체보기 (86) N
    • Language (8)
      • C (1)
      • Java (3)
      • Javascript (3)
      • Ruby (1)
    • Algorithm (6)
      • stable marriage problem (6)
    • Database (4)
      • postgres (2)
    • Developer (7)
    • DevOps (29)
      • AWS (5)
      • docker (9)
      • kubernetes (8)
      • On-premise (3)
      • monitoring (4)
    • ML engineer (3)
    • CS (11) N
      • network (4)
      • OS (2)
      • PS (1)
      • Computer Architecture (4) N
    • project (4)
    • 후기 (8)
      • 시험 (2)
      • 책 (6)
    • 회고 (6)

블로그 메뉴

  • 회고
  • Github
  • LinkedIn
  • Baekjoon
  • Japanese

공지사항

  • 공지사항

인기 글

hELLO · Designed By 정상우.v4.2.2
marsboy
[백준] 27985 멘토링 매칭
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.