본문 바로가기

Coding

Python으로 우리팀 MBTI 궁합 알아보기~

MBTI을 보고 서로의 성향을 파악해서 팀웍을 키우라는 건 이과 인 우리에게 너무 어려운 주문입니다.
그래서 구글링을 해보니 우리가 좋아하는 숫자로 딱 떨어지는 Reference를 찾을 수 있었습니다.

이거다. 각자 궁합도를 보고 해석하는 바가 다르겠지만 저는 이 소중한 Reference를 이렇게 사용하기로 결심합니다.

  • 궁합이 좋다면 - 이 사람과는 격식보다는 효율을 중시하는 의사소통을 합니다. 상처 받지 않을 궁합이니까요.
  • 궁합이 나쁘다면 - 우리가 소통과 관련한 책을 읽어온 이유입니다. 비언어적 소통을 가미하여 팀웍을 향상시키도록 사용합니다.

나 혼자만 보고 나만의 해석으로 대처하면 언어의 사회성을 무시하는 것입니다.

그래서 팀원들의 MBTI를 받아 내가 확인한 궁합을 분석해주고 이를 토대로 행동강령을 명확하게 정의해보려 합니다.
우선, 분석.. 분석이 중요합니다.

분석

팀원들의 MBTI를 받았습니다. 저를 포함해 총 9명의 MBTI를 얻을 수 있었습니다.

part_mbti = {
    '파트원1': 'ENTP',
    '파트원2': 'INTJ',
    '파트원3': 'ESFJ',
    '파트원4': 'ENFP',
    '파트원5': 'INFP',
    '파트원6': 'ESFJ',
    '파트원7': 'ENFJ',
    '파트원8': 'ESFJ',
    '파트원9': 'INTP'
}

이 때 협조하지 않으시는 분들도 있었는데 이 분들은 궁합이 나쁜 쪽으로 생각 하기로 합니다. 

위 Reference와 파트원들에게 받은 MBTI를 가지고 최종적으로 아래와 같은 결과를 얻었습니다.

------MBTI 현황------
ESFJ: ['파트원3', '파트원6', '파트원8']
ENTP: ['파트원1']
INTJ: ['파트원2']
ENFP: ['파트원4']
INFP: ['파트원5']
ENFJ: ['파트원7']
INTP: ['파트원9']
------인싸 현황-------
파트원2: 32
파트원1: 31
파트원9: 30
파트원4: 28
파트원5: 28
파트원7: 28
파트원3: 21
파트원6: 21
파트원8: 21
------MBTI 궁합------
파트원1(ENTP)님 + 파트원1(ENTP)님 = 아주 좋은 관계가 될 수 있음!
파트원1(ENTP)님 + 파트원2(INTJ)님 = 우리 인연 영원히 뽀에버! 천생연분!
파트원1(ENTP)님 + 파트원3(ESFJ)님 = 뭐.. 최악은 면했지만 그닥..
파트원1(ENTP)님 + 파트원4(ENFP)님 = 아주 좋은 관계가 될 수 있음!
파트원1(ENTP)님 + 파트원5(INFP)님 = 아주 좋은 관계가 될 수 있음!
파트원1(ENTP)님 + 파트원6(ESFJ)님 = 뭐.. 최악은 면했지만 그닥..
파트원1(ENTP)님 + 파트원7(ENFJ)님 = 아주 좋은 관계가 될 수 있음!
...
-------조 추천 -------
+ 1 조
  + 파트원1 파트원2 파트원4 파트원5 파트원7 파트원9 
+ 2 조
  + 파트원3 파트원6 파트원8 

 

 

어떻게 이 결과를 얻었는지 스크롤압박과 함께 설명들어갑니다. (GitHub 에서 코드 확인하세요)

일단 위 Reference로 몇 가지 상수를 만들어봅니다.

MBTI_GOODNESS = np.matrix([
    [4, 4, 4, 5, 4, 5, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1],
    [4, 4, 5, 4, 5, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1],
    [4, 5, 4, 4, 4, 4, 4, 5, 1, 1, 1, 1, 1, 1, 1, 1],
    [5, 4, 4, 4, 4, 4, 4, 4, 5, 1, 1, 1, 1, 1, 1, 1],
    [4, 5, 4, 4, 4, 4, 4, 5, 3, 3, 3, 3, 2, 2, 2, 2],
    [5, 4, 4, 4, 4, 4, 5, 4, 3, 3, 3, 3, 3, 3, 3, 3],
    [4, 4, 4, 4, 4, 5, 4, 4, 3, 3, 3, 3, 2, 2, 2, 5],
    [4, 4, 5, 4, 5, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2],
    [1, 1, 1, 5, 3, 3, 3, 3, 2, 2, 2, 2, 3, 5, 3, 5],
    [1, 1, 1, 1, 3, 3, 3, 3, 2, 2, 2, 2, 5, 3, 5, 3],
    [1, 1, 1, 1, 3, 3, 3, 3, 2, 2, 2, 2, 3, 5, 3, 5],
    [1, 1, 1, 1, 3, 3, 3, 3, 2, 2, 2, 2, 5, 3, 5, 3],
    [1, 1, 1, 1, 2, 3, 2, 2, 3, 5, 3, 5, 4, 4, 4, 4],
    [1, 1, 1, 1, 2, 3, 2, 2, 5, 3, 5, 3, 4, 4, 4, 4],
    [1, 1, 1, 1, 2, 3, 2, 2, 3, 5, 3, 5, 4, 4, 4, 4],
    [1, 1, 1, 1, 2, 3, 5, 2, 5, 3, 5, 3, 4, 4, 4, 4]
])

MBTI_MAP = dict(
    INFP=0,
    ENFP=1,
    INFJ=2,
    ENFJ=3,
    INTJ=4,
    ENTJ=5,
    INTP=6,
    ENTP=7,
    ISFP=8,
    ESFP=9,
    ISTP=10,
    ESTP=11,
    ISFJ=12,
    ESFJ=13,
    ISTJ=14,
    ESTJ=15
)

GOODNESS_DESC = [
    '',
    '진짜 궁합 최악! 지구 멸망의 길',
    '뭐.. 최악은 면했지만 그닥..',
    '안 맞는 것, 맞는 것 딱 반반',
    '아주 좋은 관계가 될 수 있음!',
    '우리 인연 영원히 뽀에버! 천생연분!'
]

시작이 좋습니다. 첫 작업 후, 머리를 굴리는 것보다 손가락이 더 효율적이라는 것을 깨달았습니다.

그 후 다음과 같은 분석 클래스를 하나 만들어봅니다.

import numpy as np
import pandas as pd
import collections
import scipy.cluster.hierarchy as hcl

from scipy.spatial.distance import squareform

class MbtiAnalysis:
    def __init__(self, member_mbti_dict):
        self._mbti_dict = member_mbti_dict.copy()
        self._member_num = [k for k in self._mbti_dict.keys()]
        self._member_vibe = collections.defaultdict(dict)
        self._member_score = collections.defaultdict(int)
        self._mbti_inverted = collections.defaultdict(list)
        self._linkage = None

        self._init_mbti_inverted()
        self._init_vibe()

    def _init_mbti_inverted(self):
        for key, value in self._mbti_dict.items():
            self._mbti_inverted[value].append(key)

        self._mbti_inverted = [(k, v) for k, v in self._mbti_inverted.items()]
        self._mbti_inverted.sort(key=lambda tup: len(tup[1]), reverse=True)


    def _init_vibe(self):
        for i in range(0, len(self._member_num)):
            for j in range(0, len(self._member_num)):
                first_member, first_member_mbti = self._get_member_mbti(i)
                second_member, second_member_mbti = self._get_member_mbti(j)
                goodness = mbti_goodness.item((MBTI_MAP[first_member_mbti], MBTI_MAP[second_member_mbti]))
                self._member_score[first_member] += goodness
                self._member_vibe[first_member][second_member] = goodness


    def _get_member_mbti(self, idx):
        return (self._member_num[idx], self._mbti_dict[self._member_num[idx]])

    @property
    def member_score(self):
        return sorted([(member, score) for member, score in self._member_score.items()], key=lambda tup: tup[1], reverse=True)

    @property
    def mbti_inverted(self):
        return self._mbti_inverted

    @property
    def mbti_distance_matrix(self):
        data = {}
        idx = 0
        for member, vibe in self._member_vibe.items():
            data[idx] = [5 - goodness for _, goodness in vibe.items()]
            data[idx][idx] = 0
            idx += 1

        member_vibe = pd.DataFrame(data)
        return member_vibe

    @property
    def mbti_dict(self):
        return self._member_vibe

    @property
    def member(self):
        return self._member_num

    def get_cluster_info(self, max_distance=2):
        if self._linkage is None:
            self._linkage = hcl.linkage(squareform(self.mbti_distance_matrix))

        cluster = hcl.fcluster(self._linkage, max_distance, criterion='distance')

        cluster_info = collections.defaultdict(list)

        for idx, cluster_no in enumerate(cluster):
            cluster_info[cluster_no].append(self._member_num[idx])

        return cluster_info

    def print_vibe(self):
        for member, vibe in self._member_vibe.items():
            for another_member, goodness in vibe.items():
                print(f'{member}({self._mbti_dict[member]})님 + {another_member}({self._mbti_dict[another_member]})님 = {GOODNESS_DESC[goodness]}')

    def print_score(self):
        for member, score in self.member_score:
            print(f'{member}: {score}')

    def print_mbti_inverted(self):
        for mbti_type, members in self.mbti_inverted:
            print(f'{mbti_type}: {members}')

    def print_cluster_info(self, max_distance=2):
        cluster_info = self.get_cluster_info(max_distance)
        for cluster_no, members in cluster_info.items():
            print(f'+ {cluster_no} 조')
            print('  + ', end='')
            for member in members:
                print(f'{member} ', end='')
            print('')

유형 및 궁합 분석

가장 불편했던 점은 저 맵을 하나씩 보는 것이었습니다.

새로운 팀원의 MBTI를 알아낼 때마다 맵을 보는 것이 불편했습니다.

각 팀원들 간의 궁합을 _init_vibe()를 통해 self._member_vibe에 초기화합니다.

이제 출력만하면 끝입니다.

print_vibe()를 통해 다음과 같이 각 팀원들간의 궁합을 확인할 수 있습니다.

------MBTI 궁합------
파트원1(ENTP)님 + 파트원1(ENTP)님 = 아주 좋은 관계가 될 수 있음!
파트원1(ENTP)님 + 파트원2(INTJ)님 = 우리 인연 영원히 뽀에버! 천생연분!
파트원1(ENTP)님 + 파트원3(ESFJ)님 = 뭐.. 최악은 면했지만 그닥..
파트원1(ENTP)님 + 파트원4(ENFP)님 = 아주 좋은 관계가 될 수 있음!
파트원1(ENTP)님 + 파트원5(INFP)님 = 아주 좋은 관계가 될 수 있음!
파트원1(ENTP)님 + 파트원6(ESFJ)님 = 뭐.. 최악은 면했지만 그닥..
파트원1(ENTP)님 + 파트원7(ENFJ)님 = 아주 좋은 관계가 될 수 있음!
파트원1(ENTP)님 + 파트원8(ESFJ)님 = 뭐.. 최악은 면했지만 그닥..
파트원1(ENTP)님 + 파트원9(INTP)님 = 아주 좋은 관계가 될 수 있음!
파트원2(INTJ)님 + 파트원1(ENTP)님 = 우리 인연 영원히 뽀에버! 천생연분!
파트원2(INTJ)님 + 파트원2(INTJ)님 = 아주 좋은 관계가 될 수 있음!
파트원2(INTJ)님 + 파트원3(ESFJ)님 = 뭐.. 최악은 면했지만 그닥..
파트원2(INTJ)님 + 파트원4(ENFP)님 = 우리 인연 영원히 뽀에버! 천생연분!
파트원2(INTJ)님 + 파트원5(INFP)님 = 아주 좋은 관계가 될 수 있음!
파트원2(INTJ)님 + 파트원6(ESFJ)님 = 뭐.. 최악은 면했지만 그닥..
파트원2(INTJ)님 + 파트원7(ENFJ)님 = 아주 좋은 관계가 될 수 있음!
파트원2(INTJ)님 + 파트원8(ESFJ)님 = 뭐.. 최악은 면했지만 그닥..
파트원2(INTJ)님 + 파트원9(INTP)님 = 아주 좋은 관계가 될 수 있음!
파트원3(ESFJ)님 + 파트원1(ENTP)님 = 뭐.. 최악은 면했지만 그닥..
파트원3(ESFJ)님 + 파트원2(INTJ)님 = 뭐.. 최악은 면했지만 그닥..
파트원3(ESFJ)님 + 파트원3(ESFJ)님 = 아주 좋은 관계가 될 수 있음!
파트원3(ESFJ)님 + 파트원4(ENFP)님 = 진짜 궁합 최악! 지구 멸망의 길
파트원3(ESFJ)님 + 파트원5(INFP)님 = 진짜 궁합 최악! 지구 멸망의 길
파트원3(ESFJ)님 + 파트원6(ESFJ)님 = 아주 좋은 관계가 될 수 있음!
파트원3(ESFJ)님 + 파트원7(ENFJ)님 = 진짜 궁합 최악! 지구 멸망의 길
파트원3(ESFJ)님 + 파트원8(ESFJ)님 = 아주 좋은 관계가 될 수 있음!
파트원3(ESFJ)님 + 파트원9(INTP)님 = 뭐.. 최악은 면했지만 그닥..
파트원4(ENFP)님 + 파트원1(ENTP)님 = 아주 좋은 관계가 될 수 있음!
파트원4(ENFP)님 + 파트원2(INTJ)님 = 우리 인연 영원히 뽀에버! 천생연분!
파트원4(ENFP)님 + 파트원3(ESFJ)님 = 진짜 궁합 최악! 지구 멸망의 길
파트원4(ENFP)님 + 파트원4(ENFP)님 = 아주 좋은 관계가 될 수 있음!
파트원4(ENFP)님 + 파트원5(INFP)님 = 아주 좋은 관계가 될 수 있음!
파트원4(ENFP)님 + 파트원6(ESFJ)님 = 진짜 궁합 최악! 지구 멸망의 길
파트원4(ENFP)님 + 파트원7(ENFJ)님 = 아주 좋은 관계가 될 수 있음!
파트원4(ENFP)님 + 파트원8(ESFJ)님 = 진짜 궁합 최악! 지구 멸망의 길
파트원4(ENFP)님 + 파트원9(INTP)님 = 아주 좋은 관계가 될 수 있음!
파트원5(INFP)님 + 파트원1(ENTP)님 = 아주 좋은 관계가 될 수 있음!
파트원5(INFP)님 + 파트원2(INTJ)님 = 아주 좋은 관계가 될 수 있음!
파트원5(INFP)님 + 파트원3(ESFJ)님 = 진짜 궁합 최악! 지구 멸망의 길
파트원5(INFP)님 + 파트원4(ENFP)님 = 아주 좋은 관계가 될 수 있음!
파트원5(INFP)님 + 파트원5(INFP)님 = 아주 좋은 관계가 될 수 있음!
파트원5(INFP)님 + 파트원6(ESFJ)님 = 진짜 궁합 최악! 지구 멸망의 길
파트원5(INFP)님 + 파트원7(ENFJ)님 = 우리 인연 영원히 뽀에버! 천생연분!
파트원5(INFP)님 + 파트원8(ESFJ)님 = 진짜 궁합 최악! 지구 멸망의 길
파트원5(INFP)님 + 파트원9(INTP)님 = 아주 좋은 관계가 될 수 있음!
파트원6(ESFJ)님 + 파트원1(ENTP)님 = 뭐.. 최악은 면했지만 그닥..
파트원6(ESFJ)님 + 파트원2(INTJ)님 = 뭐.. 최악은 면했지만 그닥..
파트원6(ESFJ)님 + 파트원3(ESFJ)님 = 아주 좋은 관계가 될 수 있음!
파트원6(ESFJ)님 + 파트원4(ENFP)님 = 진짜 궁합 최악! 지구 멸망의 길
파트원6(ESFJ)님 + 파트원5(INFP)님 = 진짜 궁합 최악! 지구 멸망의 길
파트원6(ESFJ)님 + 파트원6(ESFJ)님 = 아주 좋은 관계가 될 수 있음!
파트원6(ESFJ)님 + 파트원7(ENFJ)님 = 진짜 궁합 최악! 지구 멸망의 길
파트원6(ESFJ)님 + 파트원8(ESFJ)님 = 아주 좋은 관계가 될 수 있음!
파트원6(ESFJ)님 + 파트원9(INTP)님 = 뭐.. 최악은 면했지만 그닥..
파트원7(ENFJ)님 + 파트원1(ENTP)님 = 아주 좋은 관계가 될 수 있음!
파트원7(ENFJ)님 + 파트원2(INTJ)님 = 아주 좋은 관계가 될 수 있음!
파트원7(ENFJ)님 + 파트원3(ESFJ)님 = 진짜 궁합 최악! 지구 멸망의 길
파트원7(ENFJ)님 + 파트원4(ENFP)님 = 아주 좋은 관계가 될 수 있음!
파트원7(ENFJ)님 + 파트원5(INFP)님 = 우리 인연 영원히 뽀에버! 천생연분!
파트원7(ENFJ)님 + 파트원6(ESFJ)님 = 진짜 궁합 최악! 지구 멸망의 길
파트원7(ENFJ)님 + 파트원7(ENFJ)님 = 아주 좋은 관계가 될 수 있음!
파트원7(ENFJ)님 + 파트원8(ESFJ)님 = 진짜 궁합 최악! 지구 멸망의 길
파트원7(ENFJ)님 + 파트원9(INTP)님 = 아주 좋은 관계가 될 수 있음!
파트원8(ESFJ)님 + 파트원1(ENTP)님 = 뭐.. 최악은 면했지만 그닥..
파트원8(ESFJ)님 + 파트원2(INTJ)님 = 뭐.. 최악은 면했지만 그닥..
파트원8(ESFJ)님 + 파트원3(ESFJ)님 = 아주 좋은 관계가 될 수 있음!
파트원8(ESFJ)님 + 파트원4(ENFP)님 = 진짜 궁합 최악! 지구 멸망의 길
파트원8(ESFJ)님 + 파트원5(INFP)님 = 진짜 궁합 최악! 지구 멸망의 길
파트원8(ESFJ)님 + 파트원6(ESFJ)님 = 아주 좋은 관계가 될 수 있음!
파트원8(ESFJ)님 + 파트원7(ENFJ)님 = 진짜 궁합 최악! 지구 멸망의 길
파트원8(ESFJ)님 + 파트원8(ESFJ)님 = 아주 좋은 관계가 될 수 있음!
파트원8(ESFJ)님 + 파트원9(INTP)님 = 뭐.. 최악은 면했지만 그닥..
파트원9(INTP)님 + 파트원1(ENTP)님 = 아주 좋은 관계가 될 수 있음!
파트원9(INTP)님 + 파트원2(INTJ)님 = 아주 좋은 관계가 될 수 있음!
파트원9(INTP)님 + 파트원3(ESFJ)님 = 뭐.. 최악은 면했지만 그닥..
파트원9(INTP)님 + 파트원4(ENFP)님 = 아주 좋은 관계가 될 수 있음!
파트원9(INTP)님 + 파트원5(INFP)님 = 아주 좋은 관계가 될 수 있음!
파트원9(INTP)님 + 파트원6(ESFJ)님 = 뭐.. 최악은 면했지만 그닥..
파트원9(INTP)님 + 파트원7(ENFJ)님 = 아주 좋은 관계가 될 수 있음!
파트원9(INTP)님 + 파트원8(ESFJ)님 = 뭐.. 최악은 면했지만 그닥..
파트원9(INTP)님 + 파트원9(INTP)님 = 아주 좋은 관계가 될 수 있음!

이 과정 중에 어떤 MBTI Type별 사람들이 있는지도 구해볼 수 있었습니다.

def _init_mbti_inverted(self):
        for key, value in self._mbti_dict.items():
            self._mbti_inverted[value].append(key)

        self._mbti_inverted = [(k, v) for k, v in self._mbti_inverted.items()]
        self._mbti_inverted.sort(key=lambda tup: len(tup[1]), reverse=True)

우리 파트에는 ESFJ 유형의 사람들이 많았네요.

ESFJ: ['파트원3', '파트원6', '파트원8']
ENTP: ['파트원1']
INTJ: ['파트원2']
ENFP: ['파트원4']
INFP: ['파트원5']
ENFJ: ['파트원7']
INTP: ['파트원9']

궁합으로 보는 인싸

ESFJ 유형 한 분이 저와 궁합이 안좋아서 이 분과 좋은 궁합은 누군지 확인하고는 재밌는 결과를 얻었습니다.

ESFJ분들끼리만 서로 잘 맞더라구요 ㅎㅎ

"궁합 점수가 가장 높은 사람은?" 누가 인싸냐는거 아니겠습니까?

줄 세우기를 좋아하는 건 저도 어쩔 수 없나 봅니다.

_init_vibe() 에서 저장해놓은 팀원별 점수를 print_score() 메서드를 통해 출력해보겠습니다.

for member, score in self.member_score:
            print(f'{member}: {score}')

파트원2: 32
파트원1: 31
파트원9: 30
파트원4: 28
파트원5: 28
파트원7: 28
파트원3: 21
파트원6: 21
파트원8: 21

팀을 짜보자

MBTI로 팀웍을 키우자? MBTI 궁합이 잘 맞으면 정말 팀웍에 영향을 주는걸까요?

실제로 팀을 이렇게 짤 리는 절대 없겠습니다만, 교육 세션에서 한 번 소규모 프로젝트를 해보면 재밌는 실험이 될 수 있을 것 같습니다.

팀을 짜보도록 하겠습니다.

궁합도를 거꾸로 뒤집으면 두 팀원간의 마음의 거리가 됩니다.

이 거리를 Matrix로 표현하면 Distance Matrix입니다.

구글에 Clustering by distance matrix를 쳐봅니다.

펜실베니아 주립대학인가요? Hierarchical Clustering.) 관련 자료가 나오네요.

간단하게 제가 이해한 내용은 이렇습니다.

둘 간의 거리가 가장 가까운 Element 둘을 연결합니다.

예를 들어, 3번과 5번의 Distance가 가장 가까우면 일단 연결합니다.

그리고 새로운 Element를 35라고 칭하고 다시 Distance Matrix를 그립니다.

그렇다면 35와 {1, 2, 4}의 Distance는 어떻게 될까요?

클러스터링할 때 이용할 첫 번째 변수입니다.

저는 MIN(distance(3, 1), distance(5, 1))로 35와 1의 Distance를 구하면 될 것 같습니다.

마음의 거리가 먼 사람이 다른 사람과 친하다고 해서 하나의 그룹이 되면 안되잖아요?ㅎㅎ

자, 이 과정을 하나의 Element만 남을 때까지 반복합니다.

최종적으로 매 횟수마다 계층형 관계가 추가되게 되는데 토너먼트 과정같이 다음과 같은 그림을 그려볼 수 있습니다.

세로축은 특정 Element 두 개가 연결될 때, 두 Element 간 거리를 의미합니다.

이제 클러스터링할 차례입니다.

아래 그림과 같이 Distance를 기준으로 빨간 줄을 그으면 특정 클러스터 내에 마음의 거리가 그 빨간 줄 이내로 들어오는 클러스터가 만들어집니다.

자 이제 이론은 끝났습니다.

이론은 항상 길었지만 scipy 라이브러리에 고스란히 들어있습니다.

저는 최대 Distance를 2로 설정하겠습니다. (궁합도는 1 ~ 5이니까, 최소 "반반"인 사람이 한 그룹에 있으면 어떨까요?)

아주 쉽게 Linkage를 구하고 Hierarchical Clustering을 통해 다음과 같은 결과를 얻을 수 있습니다.

    def get_cluster_info(self, max_distance=2):
        if self._linkage is None:
            self._linkage = hcl.linkage(squareform(self.mbti_distance_matrix))

        cluster = hcl.fcluster(self._linkage, max_distance, criterion='distance')

        cluster_info = collections.defaultdict(list)

        for idx, cluster_no in enumerate(cluster):
            cluster_info[cluster_no].append(self._member_num[idx])

        return cluster_info

    def print_cluster_info(self, max_distance=2):
        cluster_info = self.get_cluster_info(max_distance)
        for cluster_no, members in cluster_info.items():
            print(f'+ {cluster_no} 조')
            print('  + ', end='')
            for member in members:
                print(f'{member} ', end='')
            print('')

# Output
+ 1 조
  + 파트원1 파트원2 파트원4 파트원5 파트원7 파트원9 
+ 2 조
  + 파트원3 파트원6 파트원8 

결론

ㅋㅋㅋ 진짜로 이 걸로 사회생활을 할 생각은 추호도 없습니다.

다만, 팀 내에서 이 프로그램 가지고 즐거운 시간을 잠시 보내서 이렇게 포스팅하게 되었습니다.

원본은 노트북 파일로 GitHub에 올라가 있습니다.

다음 포스팅 때는 이 거 가지고 간단한 웹을 한 번 만들어 볼까 합니다.

Python과 노트북은 참 간단히 아이디어를 구현할 수 있는 좋은 도구인 것 같습니다. :)

'Coding' 카테고리의 다른 글

Git Commit Message를 위한 VI Core editor 설정  (0) 2020.12.03
코드에서 Path를 처리할 때  (0) 2020.03.25
[pep8] Private Attributes  (0) 2018.07.09