문제

페어 프로그래밍은 하나의 컴퓨터에서 두 사람의 프로그래머가 작업하는 방식을 의미한다.
진정한 프로그래머가 되기 위해 김해피는 페어를 매칭하기 위한 프로그램을 작성하려고 한다.
클래스를 활용해 작성하며 포함되는 메서드는 아래와 같다.

구성 요소     
1. 초기화 메서드는 인자로 학생 이름으로 구성된 리스트를 받아서 인스턴스 변수에 할당한다.
2. pick(n) 메서드는 학생들 명단에서 인자 n명 만큼 랜덤으로 추출하여 return한다.     
3. match_pair() 메서드는 학생들 명단을 랜덤으로 2명씩 매칭해 준다. 
이때, 학생들 명단의 수가 홀수명이면 단 한팀만 3명으로 구성한다

 

 


풀이

import random

class Pair:
    result = []
    def __init__(self, lst):
        self.lst = lst        
    def pick(self, num):
        return random.sample(self.lst, num)
    def match_pair(self):
        if len(self.lst) % 2 ==0:  # 학생 수가 짝수일때
            for i in range(0, int(len(self.lst) / 2)): # 두명씩 묶어줄 것이기 때문에 4명이면 2번 6명이면 3번 돌린다.
                Pair.result.append(random.sample(self.lst, 2)) # 일단 random으로 비어있는 리스트에 두명을 넣어준다.
                self.lst.remove(Pair.result[i][0]) # 중복되는 값이 들어가면 안되기 때문에 추가된 두명에서 첫 사람을 기존 리스트에서 삭제해준다.
                if len(self.lst) > 2: # 기존 리스트에 학생이 2명이 된다면 지우지 않아도 된다. 이미 모두 들어가 있기 때문.
                    self.lst.remove(Pair.result[i][1]) 
            return Pair.result
        else:
            for i in range(0, int(len(self.lst) // 2)):
                if len(self.lst) > 3:   # 홀수일 경우엔 학생 세명이상의 경우는 추가한 모든 요소를 기존 리스트에서 지워준다.
                    Pair.result.append(random.sample(self.lst, 2))
                    self.lst.remove(Pair.result[i][0])
                    self.lst.remove(Pair.result[i][1])
                else: # 학생 수가 세명이 되었다면 남아있는 학생들을 넣어주면 된다.
                    Pair.result.append(self.lst)
            return Pair.result
a1 = Pair(['일등', '이등', '삼등', '사등', '오등'])
print(a1.match_pair())

 

 


해설

어려웠다.. 처음 생각 했던 것보다 어려웠던 문제이다.

단순히 random.sample 메서드를 사용해서 어떤 리스트의 두명을 추출하는게 아니다.

문제의 핵심은 임의의 학생 두명을 묶어 리스트로 만들어야하고 무엇보다 '중복되면 안된다.'

이 중복되면 안된다는 것이 너무 어려웠던 문제이다.

 

첫 도전 !....

처음엔 단순히 랜덤으로 임의의 두 학생을 묶은 리스트를 만들었지만, 말했듯이 중복되면 안된다.

이부분을 풀기위해 이런 저런 시도를 많이 해보았다.

학생이 짝수인 경우엔 for문을 통해 랜덤의 두 학생을 리스트에 넣어주고, 추가한 학생을 기존 리스트에서 제거해야한다.

 

갈수록...

이 기존의 리스트에서 추가한 학생을 제거하는 과정이 나에겐 매우 어려웠다.

내가 모르는 방법이나 내부 함수, 메서드가 있을지 모른다. 높은 확률로 그런것 같다.

나는 remove를 선택했다. remove를 통해 제거를 해주고 다시 그 제거한 리스트에서 랜덤으로 추출했다.

 

혹시 다른 접근 방법이 있다면 알려주세요!!!!!!!!!!!!!!!!!!!!!!!!!!

복사했습니다!