ewhk9887/korean_code_reviews_from_github huggingface dataset:
@@ -0,0 +1,75 @@
+import pandas as pd
+import numpy as np
+
+#제출자 리스트(수기 입력)
+videos = ['조용원', '정태호', '정우민', '장진희', '임채은', '이승수', '이남준', '윤다솜', '오유리나', '신수아', '백송하', '박원빈', '김현우', '김현수', '김태호', '김태연', '김의식', '김영우', '김세형', '강지호', '강수현']
+#Urclass 수강생 현황 csv 불러오기
+df = pd.read_csv('1012.csv')
+
+def group_maker(random_seed, video=len(videos), videos=videos, ur_list=df, group_num=7):
+    """
+    인원 배치는 랜덤이되 각 조에 제출자의 수가 일정하게 들어가게끔 프로젝트 조 짜는 함수입니다
+
+    --파라미터--
+    * Random seed
+    * video = 실제 제출자 수 (int) -> 제출자 명단이 잘 입력됐나 확인하기 위함
+    * videos = 제출자 명단 (list)
+    * ur_list = Urclass에서 export한 기수 명단 (dataframe)
+    * group_num = 조 수 (int)
+    """
+    try:
+        assert len(videos) == video #제출자 명단이 잘 입력되었는지 확인
+
+        #미제출자 리스트
+        non_videos = [name for name in ur_list['이름'].values if name not in videos]
+
+        try: #미제출자 리스트가 잘 뽑혔는지 확인 (한글이라 잘못 뽑히는 경우 있음)
+            assert len(videos) + len(non_videos) == len(ur_list)
+
+            #조 배정 시작!
+            np.random.seed(random_seed)
+            np.random.shuffle(videos)
+            np.random.shuffle(non_videos)
+
+            video = int(len(videos)/group_num) #한 조 최소 제출자 인원
+            non_video = int(len(non_videos)/group_num) #한 조 최소 미제출자 인원
+            groups = {}
+
+            for i in range(group_num+1):
+                if i == group_num:
+                    #1조부터 미제출자 나머지 인원 배치
+                    for j in range(len(non_videos[non_video*i:])):
+                        groups[f'{j+1}조'].append(non_videos.pop())
+                    
+                    #뒷 조부터 제출자 나머지 인원 배치
+                    for j in range(len(videos[video*i:])):
+                        groups[f'{group_num-j}조'].append(videos.pop())
+
+                    return groups
+                
+                group = videos[video*i:video*(i+1)]
+                group = group + non_videos[non_video*i:non_video*(i+1)]
+                groups[f'{i+1}조'] = group
+        
+        except:
+            print(f'미 제출자 리스트를 확인하세요')
+            print(f'\t* 총 인원 수: {len(ur_list)}명, \n\t* 미 제출자 리스트: {len(non_videos)}명, \n{non_videos}, \n\t* 제출자 리스트: {len(videos)}명, {videos}')
+    
+    except:
+        print('입력한 제출자 인원 수와 제출자 명단에 있는 수가 일치하지 않습니다. 제출자 명단을 확인해 주세요')
+
+if __name__ == "__main__":
+    #그룹 만들기
+    groups = group_maker(random_seed=1012, video=21)
+
+    #명단 출력
+    for group in groups:
+        print(groups.get(group))
+    
+    #수강생 이름이 빠짐없이 들어갔는지 재확인
+    j=0
+    for group in groups:
+        i = len(groups.get(group))
+        j += i
+
+    assert j == len(df)

리뷰: 하나의 함수에는 하나의 로직이 들어갈 수 있도록 변경해보는건 어떨까요?
@@ -0,0 +1,75 @@
+import pandas as pd
+import numpy as np
+
+#제출자 리스트(수기 입력)
+videos = ['조용원', '정태호', '정우민', '장진희', '임채은', '이승수', '이남준', '윤다솜', '오유리나', '신수아', '백송하', '박원빈', '김현우', '김현수', '김태호', '김태연', '김의식', '김영우', '김세형', '강지호', '강수현']
+#Urclass 수강생 현황 csv 불러오기
+df = pd.read_csv('1012.csv')
+
+def group_maker(random_seed, video=len(videos), videos=videos, ur_list=df, group_num=7):
+    """
+    인원 배치는 랜덤이되 각 조에 제출자의 수가 일정하게 들어가게끔 프로젝트 조 짜는 함수입니다
+
+    --파라미터--
+    * Random seed
+    * video = 실제 제출자 수 (int) -> 제출자 명단이 잘 입력됐나 확인하기 위함
+    * videos = 제출자 명단 (list)
+    * ur_list = Urclass에서 export한 기수 명단 (dataframe)
+    * group_num = 조 수 (int)
+    """
+    try:
+        assert len(videos) == video #제출자 명단이 잘 입력되었는지 확인
+
+        #미제출자 리스트
+        non_videos = [name for name in ur_list['이름'].values if name not in videos]
+
+        try: #미제출자 리스트가 잘 뽑혔는지 확인 (한글이라 잘못 뽑히는 경우 있음)
+            assert len(videos) + len(non_videos) == len(ur_list)
+
+            #조 배정 시작!
+            np.random.seed(random_seed)
+            np.random.shuffle(videos)
+            np.random.shuffle(non_videos)
+
+            video = int(len(videos)/group_num) #한 조 최소 제출자 인원
+            non_video = int(len(non_videos)/group_num) #한 조 최소 미제출자 인원
+            groups = {}
+
+            for i in range(group_num+1):
+                if i == group_num:
+                    #1조부터 미제출자 나머지 인원 배치
+                    for j in range(len(non_videos[non_video*i:])):
+                        groups[f'{j+1}조'].append(non_videos.pop())
+                    
+                    #뒷 조부터 제출자 나머지 인원 배치
+                    for j in range(len(videos[video*i:])):
+                        groups[f'{group_num-j}조'].append(videos.pop())
+
+                    return groups
+                
+                group = videos[video*i:video*(i+1)]
+                group = group + non_videos[non_video*i:non_video*(i+1)]
+                groups[f'{i+1}조'] = group
+        
+        except:
+            print(f'미 제출자 리스트를 확인하세요')
+            print(f'\t* 총 인원 수: {len(ur_list)}명, \n\t* 미 제출자 리스트: {len(non_videos)}명, \n{non_videos}, \n\t* 제출자 리스트: {len(videos)}명, {videos}')
+    
+    except:
+        print('입력한 제출자 인원 수와 제출자 명단에 있는 수가 일치하지 않습니다. 제출자 명단을 확인해 주세요')
+
+if __name__ == "__main__":
+    #그룹 만들기
+    groups = group_maker(random_seed=1012, video=21)
+
+    #명단 출력
+    for group in groups:
+        print(groups.get(group))
+    
+    #수강생 이름이 빠짐없이 들어갔는지 재확인
+    j=0
+    for group in groups:
+        i = len(groups.get(group))
+        j += i
+
+    assert j == len(df)

리뷰: 어떤 에러가 발생했을까요? 에러를 확인해보고 `except {??Exception}` 으로 관리해주신다면 에러관리하기 더 수월할 것으로 보입니다 !
@@ -0,0 +1,75 @@
+import pandas as pd
+import numpy as np
+
+#제출자 리스트(수기 입력)
+videos = ['조용원', '정태호', '정우민', '장진희', '임채은', '이승수', '이남준', '윤다솜', '오유리나', '신수아', '백송하', '박원빈', '김현우', '김현수', '김태호', '김태연', '김의식', '김영우', '김세형', '강지호', '강수현']
+#Urclass 수강생 현황 csv 불러오기
+df = pd.read_csv('1012.csv')
+
+def group_maker(random_seed, video=len(videos), videos=videos, ur_list=df, group_num=7):
+    """
+    인원 배치는 랜덤이되 각 조에 제출자의 수가 일정하게 들어가게끔 프로젝트 조 짜는 함수입니다
+
+    --파라미터--
+    * Random seed
+    * video = 실제 제출자 수 (int) -> 제출자 명단이 잘 입력됐나 확인하기 위함
+    * videos = 제출자 명단 (list)
+    * ur_list = Urclass에서 export한 기수 명단 (dataframe)
+    * group_num = 조 수 (int)
+    """
+    try:
+        assert len(videos) == video #제출자 명단이 잘 입력되었는지 확인
+
+        #미제출자 리스트
+        non_videos = [name for name in ur_list['이름'].values if name not in videos]
+
+        try: #미제출자 리스트가 잘 뽑혔는지 확인 (한글이라 잘못 뽑히는 경우 있음)
+            assert len(videos) + len(non_videos) == len(ur_list)
+
+            #조 배정 시작!
+            np.random.seed(random_seed)
+            np.random.shuffle(videos)
+            np.random.shuffle(non_videos)
+
+            video = int(len(videos)/group_num) #한 조 최소 제출자 인원
+            non_video = int(len(non_videos)/group_num) #한 조 최소 미제출자 인원
+            groups = {}
+
+            for i in range(group_num+1):
+                if i == group_num:
+                    #1조부터 미제출자 나머지 인원 배치
+                    for j in range(len(non_videos[non_video*i:])):
+                        groups[f'{j+1}조'].append(non_videos.pop())
+                    
+                    #뒷 조부터 제출자 나머지 인원 배치
+                    for j in range(len(videos[video*i:])):
+                        groups[f'{group_num-j}조'].append(videos.pop())
+
+                    return groups
+                
+                group = videos[video*i:video*(i+1)]
+                group = group + non_videos[non_video*i:non_video*(i+1)]
+                groups[f'{i+1}조'] = group
+        
+        except:
+            print(f'미 제출자 리스트를 확인하세요')
+            print(f'\t* 총 인원 수: {len(ur_list)}명, \n\t* 미 제출자 리스트: {len(non_videos)}명, \n{non_videos}, \n\t* 제출자 리스트: {len(videos)}명, {videos}')
+    
+    except:
+        print('입력한 제출자 인원 수와 제출자 명단에 있는 수가 일치하지 않습니다. 제출자 명단을 확인해 주세요')
+
+if __name__ == "__main__":
+    #그룹 만들기
+    groups = group_maker(random_seed=1012, video=21)
+
+    #명단 출력
+    for group in groups:
+        print(groups.get(group))
+    
+    #수강생 이름이 빠짐없이 들어갔는지 재확인
+    j=0
+    for group in groups:
+        i = len(groups.get(group))
+        j += i
+
+    assert j == len(df)

리뷰: 어떤 에러가 발생하는지 추가해주시면 좋을듯합니다.
@@ -0,0 +1,75 @@
+import pandas as pd
+import numpy as np
+
+#제출자 리스트(수기 입력)
+videos = ['조용원', '정태호', '정우민', '장진희', '임채은', '이승수', '이남준', '윤다솜', '오유리나', '신수아', '백송하', '박원빈', '김현우', '김현수', '김태호', '김태연', '김의식', '김영우', '김세형', '강지호', '강수현']
+#Urclass 수강생 현황 csv 불러오기
+df = pd.read_csv('1012.csv')
+
+def group_maker(random_seed, video=len(videos), videos=videos, ur_list=df, group_num=7):
+    """
+    인원 배치는 랜덤이되 각 조에 제출자의 수가 일정하게 들어가게끔 프로젝트 조 짜는 함수입니다
+
+    --파라미터--
+    * Random seed
+    * video = 실제 제출자 수 (int) -> 제출자 명단이 잘 입력됐나 확인하기 위함
+    * videos = 제출자 명단 (list)
+    * ur_list = Urclass에서 export한 기수 명단 (dataframe)
+    * group_num = 조 수 (int)
+    """
+    try:
+        assert len(videos) == video #제출자 명단이 잘 입력되었는지 확인
+
+        #미제출자 리스트
+        non_videos = [name for name in ur_list['이름'].values if name not in videos]
+
+        try: #미제출자 리스트가 잘 뽑혔는지 확인 (한글이라 잘못 뽑히는 경우 있음)
+            assert len(videos) + len(non_videos) == len(ur_list)
+
+            #조 배정 시작!
+            np.random.seed(random_seed)
+            np.random.shuffle(videos)
+            np.random.shuffle(non_videos)
+
+            video = int(len(videos)/group_num) #한 조 최소 제출자 인원
+            non_video = int(len(non_videos)/group_num) #한 조 최소 미제출자 인원
+            groups = {}
+
+            for i in range(group_num+1):
+                if i == group_num:
+                    #1조부터 미제출자 나머지 인원 배치
+                    for j in range(len(non_videos[non_video*i:])):
+                        groups[f'{j+1}조'].append(non_videos.pop())
+                    
+                    #뒷 조부터 제출자 나머지 인원 배치
+                    for j in range(len(videos[video*i:])):
+                        groups[f'{group_num-j}조'].append(videos.pop())
+
+                    return groups
+                
+                group = videos[video*i:video*(i+1)]
+                group = group + non_videos[non_video*i:non_video*(i+1)]
+                groups[f'{i+1}조'] = group
+        
+        except:
+            print(f'미 제출자 리스트를 확인하세요')
+            print(f'\t* 총 인원 수: {len(ur_list)}명, \n\t* 미 제출자 리스트: {len(non_videos)}명, \n{non_videos}, \n\t* 제출자 리스트: {len(videos)}명, {videos}')
+    
+    except:
+        print('입력한 제출자 인원 수와 제출자 명단에 있는 수가 일치하지 않습니다. 제출자 명단을 확인해 주세요')
+
+if __name__ == "__main__":
+    #그룹 만들기
+    groups = group_maker(random_seed=1012, video=21)
+
+    #명단 출력
+    for group in groups:
+        print(groups.get(group))
+    
+    #수강생 이름이 빠짐없이 들어갔는지 재확인
+    j=0
+    for group in groups:
+        i = len(groups.get(group))
+        j += i
+
+    assert j == len(df)

리뷰: 이 부분도 함수화를 할 수 있는부분이지 않을까 싶습니다 !
@@ -0,0 +1,75 @@
+import pandas as pd
+import numpy as np
+
+#제출자 리스트(수기 입력)
+videos = ['조용원', '정태호', '정우민', '장진희', '임채은', '이승수', '이남준', '윤다솜', '오유리나', '신수아', '백송하', '박원빈', '김현우', '김현수', '김태호', '김태연', '김의식', '김영우', '김세형', '강지호', '강수현']
+#Urclass 수강생 현황 csv 불러오기
+df = pd.read_csv('1012.csv')
+
+def group_maker(random_seed, video=len(videos), videos=videos, ur_list=df, group_num=7):
+    """
+    인원 배치는 랜덤이되 각 조에 제출자의 수가 일정하게 들어가게끔 프로젝트 조 짜는 함수입니다
+
+    --파라미터--
+    * Random seed
+    * video = 실제 제출자 수 (int) -> 제출자 명단이 잘 입력됐나 확인하기 위함
+    * videos = 제출자 명단 (list)
+    * ur_list = Urclass에서 export한 기수 명단 (dataframe)
+    * group_num = 조 수 (int)
+    """
+    try:
+        assert len(videos) == video #제출자 명단이 잘 입력되었는지 확인
+
+        #미제출자 리스트
+        non_videos = [name for name in ur_list['이름'].values if name not in videos]
+
+        try: #미제출자 리스트가 잘 뽑혔는지 확인 (한글이라 잘못 뽑히는 경우 있음)
+            assert len(videos) + len(non_videos) == len(ur_list)
+
+            #조 배정 시작!
+            np.random.seed(random_seed)
+            np.random.shuffle(videos)
+            np.random.shuffle(non_videos)
+
+            video = int(len(videos)/group_num) #한 조 최소 제출자 인원
+            non_video = int(len(non_videos)/group_num) #한 조 최소 미제출자 인원
+            groups = {}
+
+            for i in range(group_num+1):
+                if i == group_num:
+                    #1조부터 미제출자 나머지 인원 배치
+                    for j in range(len(non_videos[non_video*i:])):
+                        groups[f'{j+1}조'].append(non_videos.pop())
+                    
+                    #뒷 조부터 제출자 나머지 인원 배치
+                    for j in range(len(videos[video*i:])):
+                        groups[f'{group_num-j}조'].append(videos.pop())
+
+                    return groups
+                
+                group = videos[video*i:video*(i+1)]
+                group = group + non_videos[non_video*i:non_video*(i+1)]
+                groups[f'{i+1}조'] = group
+        
+        except:
+            print(f'미 제출자 리스트를 확인하세요')
+            print(f'\t* 총 인원 수: {len(ur_list)}명, \n\t* 미 제출자 리스트: {len(non_videos)}명, \n{non_videos}, \n\t* 제출자 리스트: {len(videos)}명, {videos}')
+    
+    except:
+        print('입력한 제출자 인원 수와 제출자 명단에 있는 수가 일치하지 않습니다. 제출자 명단을 확인해 주세요')
+
+if __name__ == "__main__":
+    #그룹 만들기
+    groups = group_maker(random_seed=1012, video=21)
+
+    #명단 출력
+    for group in groups:
+        print(groups.get(group))
+    
+    #수강생 이름이 빠짐없이 들어갔는지 재확인
+    j=0
+    for group in groups:
+        i = len(groups.get(group))
+        j += i
+
+    assert j == len(df)

리뷰: 테스트 케이스가 아니라면 if 문을 쓰는게 어떨까요?!
@@ -0,0 +1,75 @@
+import pandas as pd
+import numpy as np
+
+#제출자 리스트(수기 입력)
+videos = ['조용원', '정태호', '정우민', '장진희', '임채은', '이승수', '이남준', '윤다솜', '오유리나', '신수아', '백송하', '박원빈', '김현우', '김현수', '김태호', '김태연', '김의식', '김영우', '김세형', '강지호', '강수현']
+#Urclass 수강생 현황 csv 불러오기
+df = pd.read_csv('1012.csv')
+
+def group_maker(random_seed, video=len(videos), videos=videos, ur_list=df, group_num=7):
+    """
+    인원 배치는 랜덤이되 각 조에 제출자의 수가 일정하게 들어가게끔 프로젝트 조 짜는 함수입니다
+
+    --파라미터--
+    * Random seed
+    * video = 실제 제출자 수 (int) -> 제출자 명단이 잘 입력됐나 확인하기 위함
+    * videos = 제출자 명단 (list)
+    * ur_list = Urclass에서 export한 기수 명단 (dataframe)
+    * group_num = 조 수 (int)
+    """
+    try:
+        assert len(videos) == video #제출자 명단이 잘 입력되었는지 확인
+
+        #미제출자 리스트
+        non_videos = [name for name in ur_list['이름'].values if name not in videos]
+
+        try: #미제출자 리스트가 잘 뽑혔는지 확인 (한글이라 잘못 뽑히는 경우 있음)
+            assert len(videos) + len(non_videos) == len(ur_list)
+
+            #조 배정 시작!
+            np.random.seed(random_seed)
+            np.random.shuffle(videos)
+            np.random.shuffle(non_videos)
+
+            video = int(len(videos)/group_num) #한 조 최소 제출자 인원
+            non_video = int(len(non_videos)/group_num) #한 조 최소 미제출자 인원
+            groups = {}
+
+            for i in range(group_num+1):
+                if i == group_num:
+                    #1조부터 미제출자 나머지 인원 배치
+                    for j in range(len(non_videos[non_video*i:])):
+                        groups[f'{j+1}조'].append(non_videos.pop())
+                    
+                    #뒷 조부터 제출자 나머지 인원 배치
+                    for j in range(len(videos[video*i:])):
+                        groups[f'{group_num-j}조'].append(videos.pop())
+
+                    return groups
+                
+                group = videos[video*i:video*(i+1)]
+                group = group + non_videos[non_video*i:non_video*(i+1)]
+                groups[f'{i+1}조'] = group
+        
+        except:
+            print(f'미 제출자 리스트를 확인하세요')
+            print(f'\t* 총 인원 수: {len(ur_list)}명, \n\t* 미 제출자 리스트: {len(non_videos)}명, \n{non_videos}, \n\t* 제출자 리스트: {len(videos)}명, {videos}')
+    
+    except:
+        print('입력한 제출자 인원 수와 제출자 명단에 있는 수가 일치하지 않습니다. 제출자 명단을 확인해 주세요')
+
+if __name__ == "__main__":
+    #그룹 만들기
+    groups = group_maker(random_seed=1012, video=21)
+
+    #명단 출력
+    for group in groups:
+        print(groups.get(group))
+    
+    #수강생 이름이 빠짐없이 들어갔는지 재확인
+    j=0
+    for group in groups:
+        i = len(groups.get(group))
+        j += i
+
+    assert j == len(df)

리뷰: try except를 사용하는 것보다 확인용이라면 assert 문을 활용하셔도 좋을듯합니다.
@@ -0,0 +1,75 @@
+import pandas as pd
+import numpy as np
+
+#제출자 리스트(수기 입력)
+videos = ['조용원', '정태호', '정우민', '장진희', '임채은', '이승수', '이남준', '윤다솜', '오유리나', '신수아', '백송하', '박원빈', '김현우', '김현수', '김태호', '김태연', '김의식', '김영우', '김세형', '강지호', '강수현']
+#Urclass 수강생 현황 csv 불러오기
+df = pd.read_csv('1012.csv')
+
+def group_maker(random_seed, video=len(videos), videos=videos, ur_list=df, group_num=7):
+    """
+    인원 배치는 랜덤이되 각 조에 제출자의 수가 일정하게 들어가게끔 프로젝트 조 짜는 함수입니다
+
+    --파라미터--
+    * Random seed
+    * video = 실제 제출자 수 (int) -> 제출자 명단이 잘 입력됐나 확인하기 위함
+    * videos = 제출자 명단 (list)
+    * ur_list = Urclass에서 export한 기수 명단 (dataframe)
+    * group_num = 조 수 (int)
+    """
+    try:
+        assert len(videos) == video #제출자 명단이 잘 입력되었는지 확인
+
+        #미제출자 리스트
+        non_videos = [name for name in ur_list['이름'].values if name not in videos]
+
+        try: #미제출자 리스트가 잘 뽑혔는지 확인 (한글이라 잘못 뽑히는 경우 있음)
+            assert len(videos) + len(non_videos) == len(ur_list)
+
+            #조 배정 시작!
+            np.random.seed(random_seed)
+            np.random.shuffle(videos)
+            np.random.shuffle(non_videos)
+
+            video = int(len(videos)/group_num) #한 조 최소 제출자 인원
+            non_video = int(len(non_videos)/group_num) #한 조 최소 미제출자 인원
+            groups = {}
+
+            for i in range(group_num+1):
+                if i == group_num:
+                    #1조부터 미제출자 나머지 인원 배치
+                    for j in range(len(non_videos[non_video*i:])):
+                        groups[f'{j+1}조'].append(non_videos.pop())
+                    
+                    #뒷 조부터 제출자 나머지 인원 배치
+                    for j in range(len(videos[video*i:])):
+                        groups[f'{group_num-j}조'].append(videos.pop())
+
+                    return groups
+                
+                group = videos[video*i:video*(i+1)]
+                group = group + non_videos[non_video*i:non_video*(i+1)]
+                groups[f'{i+1}조'] = group
+        
+        except:
+            print(f'미 제출자 리스트를 확인하세요')
+            print(f'\t* 총 인원 수: {len(ur_list)}명, \n\t* 미 제출자 리스트: {len(non_videos)}명, \n{non_videos}, \n\t* 제출자 리스트: {len(videos)}명, {videos}')
+    
+    except:
+        print('입력한 제출자 인원 수와 제출자 명단에 있는 수가 일치하지 않습니다. 제출자 명단을 확인해 주세요')
+
+if __name__ == "__main__":
+    #그룹 만들기
+    groups = group_maker(random_seed=1012, video=21)
+
+    #명단 출력
+    for group in groups:
+        print(groups.get(group))
+    
+    #수강생 이름이 빠짐없이 들어갔는지 재확인
+    j=0
+    for group in groups:
+        i = len(groups.get(group))
+        j += i
+
+    assert j == len(df)

리뷰: `def group_maker(random_seed, video=len(videos), videos=videos, ur_list=df, group_num=7): `
    # 함수가 선언되는 부분에는 `video=len(videos)`처럼 내장함수가 없는 것이 좋습니다.
    # 이러한 경우 함수 내부에 `video` 변수값을 받아오는 계산식을 만드는 것이 좋습니다.
    # 왜냐하면 함수선언부에 계산식이나 내장함수가 호출되면 `project_group.py코드`가 호출되거나 `group_maker함수`가 호출될 때마다 추가적으로 메모리가 소비될 수 있습니다.
@@ -0,0 +1,75 @@
+import pandas as pd
+import numpy as np
+
+#제출자 리스트(수기 입력)
+videos = ['조용원', '정태호', '정우민', '장진희', '임채은', '이승수', '이남준', '윤다솜', '오유리나', '신수아', '백송하', '박원빈', '김현우', '김현수', '김태호', '김태연', '김의식', '김영우', '김세형', '강지호', '강수현']
+#Urclass 수강생 현황 csv 불러오기
+df = pd.read_csv('1012.csv')
+
+def group_maker(random_seed, video=len(videos), videos=videos, ur_list=df, group_num=7):
+    """
+    인원 배치는 랜덤이되 각 조에 제출자의 수가 일정하게 들어가게끔 프로젝트 조 짜는 함수입니다
+
+    --파라미터--
+    * Random seed
+    * video = 실제 제출자 수 (int) -> 제출자 명단이 잘 입력됐나 확인하기 위함
+    * videos = 제출자 명단 (list)
+    * ur_list = Urclass에서 export한 기수 명단 (dataframe)
+    * group_num = 조 수 (int)
+    """
+    try:
+        assert len(videos) == video #제출자 명단이 잘 입력되었는지 확인
+
+        #미제출자 리스트
+        non_videos = [name for name in ur_list['이름'].values if name not in videos]
+
+        try: #미제출자 리스트가 잘 뽑혔는지 확인 (한글이라 잘못 뽑히는 경우 있음)
+            assert len(videos) + len(non_videos) == len(ur_list)
+
+            #조 배정 시작!
+            np.random.seed(random_seed)
+            np.random.shuffle(videos)
+            np.random.shuffle(non_videos)
+
+            video = int(len(videos)/group_num) #한 조 최소 제출자 인원
+            non_video = int(len(non_videos)/group_num) #한 조 최소 미제출자 인원
+            groups = {}
+
+            for i in range(group_num+1):
+                if i == group_num:
+                    #1조부터 미제출자 나머지 인원 배치
+                    for j in range(len(non_videos[non_video*i:])):
+                        groups[f'{j+1}조'].append(non_videos.pop())
+                    
+                    #뒷 조부터 제출자 나머지 인원 배치
+                    for j in range(len(videos[video*i:])):
+                        groups[f'{group_num-j}조'].append(videos.pop())
+
+                    return groups
+                
+                group = videos[video*i:video*(i+1)]
+                group = group + non_videos[non_video*i:non_video*(i+1)]
+                groups[f'{i+1}조'] = group
+        
+        except:
+            print(f'미 제출자 리스트를 확인하세요')
+            print(f'\t* 총 인원 수: {len(ur_list)}명, \n\t* 미 제출자 리스트: {len(non_videos)}명, \n{non_videos}, \n\t* 제출자 리스트: {len(videos)}명, {videos}')
+    
+    except:
+        print('입력한 제출자 인원 수와 제출자 명단에 있는 수가 일치하지 않습니다. 제출자 명단을 확인해 주세요')
+
+if __name__ == "__main__":
+    #그룹 만들기
+    groups = group_maker(random_seed=1012, video=21)
+
+    #명단 출력
+    for group in groups:
+        print(groups.get(group))
+    
+    #수강생 이름이 빠짐없이 들어갔는지 재확인
+    j=0
+    for group in groups:
+        i = len(groups.get(group))
+        j += i
+
+    assert j == len(df)

리뷰: ❗️ 위에 `테스트 케이스가 아니라면 if 문을 쓰는게 어떨까요?!` 라고 남겼는데, 더 찾아보니 어떤 상황을 가정하고, 그 상황이 `AssertError` 로 관리되어야한다면 if 보다 assert 를 사용하는게 더 간결하고, 명확하게 표현될 수 있겠네요 ㅇ0ㅇ 제 코멘트는 무시하셔도 좋습니다
@@ -0,0 +1,11 @@
+import styled from 'styled-components';
+
+export const HeaderWrapper = styled.header`
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  width: 100%;
+  height: ${({ theme }) => theme.boxHeight};
+  padding: 0px 24px;
+  background: ${({ theme }) => theme.color.primary.main};
+`;

리뷰: 이 구현도 정말 좋은데요~

많이 내려간 상태에서 헤더를 다시 보려면 위로 많이 올라가야해서 어려울 것 같아요
무한 페이지 특성상 position:sticky 옵션을 활용하여
네비게이션바가 뜬다면 UX경험이 더 좋아질 거같아요.
@@ -0,0 +1,37 @@
+import { ApolloServer } from 'apollo-server';
+
+import typeDefs from './typeDefs';
+import resolvers from './resolvers';
+
+import model from './database/models';
+import * as jwtManager from './util/jwt-manager';
+
+// Set GraphQL Apollo server
+const context = ({ req }) => {
+    const authorizationHeader = req.headers.authorization || '';
+    const token = authorizationHeader.split(' ')[1];
+    const user = jwtManager.isTokenValid(token);
+
+    return { user, model };
+};
+
+const formatError = err => {
+    console.error('--- GraphQL Error ---');
+    console.error('Path:', err.path);
+    console.error('Message:', err.message);
+    console.error('Code:', err.extensions.code);
+    console.error('Original Error', err.originalError);
+    return err;
+};
+
+const server = new ApolloServer({
+    typeDefs,
+    resolvers,
+    context,
+    formatError,
+    debug: false,
+});
+
+server.listen().then(({ url }) => {
+    console.log(`🚀  Server ready at ${url}`);
+});

리뷰: `authorization`이 없을때의 처리가 좋네요~
@@ -0,0 +1,37 @@
+import { ApolloServer } from 'apollo-server';
+
+import typeDefs from './typeDefs';
+import resolvers from './resolvers';
+
+import model from './database/models';
+import * as jwtManager from './util/jwt-manager';
+
+// Set GraphQL Apollo server
+const context = ({ req }) => {
+    const authorizationHeader = req.headers.authorization || '';
+    const token = authorizationHeader.split(' ')[1];
+    const user = jwtManager.isTokenValid(token);
+
+    return { user, model };
+};
+
+const formatError = err => {
+    console.error('--- GraphQL Error ---');
+    console.error('Path:', err.path);
+    console.error('Message:', err.message);
+    console.error('Code:', err.extensions.code);
+    console.error('Original Error', err.originalError);
+    return err;
+};
+
+const server = new ApolloServer({
+    typeDefs,
+    resolvers,
+    context,
+    formatError,
+    debug: false,
+});
+
+server.listen().then(({ url }) => {
+    console.log(`🚀  Server ready at ${url}`);
+});

리뷰: `token`, `user`을 만드는 구문은 어차피 `authorization`이 없으면 무효한 로직으로 보이는데요
별도의 흐름을 만들거나 별도의 함수로 분리하지 않은 이유가 있을까요?

또한 `[1]`으로 배열에서 아이템을 픽해오는 것은 암시적으로 느껴지는데요.
명시적으로 변경해보시는건 어떨까요?