본문 바로가기

알고리즘

백준/가장 가까운 세 사람의 심리적 거리/py

https://www.acmicpc.net/problem/20529

 

20529번: 가장 가까운 세 사람의 심리적 거리

각 테스트 케이스에 대한 답을 정수 형태로 한 줄에 하나씩 출력한다.

www.acmicpc.net

문제


mbti 의 거리를 구하여라

 

입력


첫 줄에는 테스트 케이스의 수를 나타내는 정수 TT가 주어진다.

각 테스트 케이스의 첫 줄에는 학생의 수를 나타내는 하나의 정수 NN이 주어지며, 두 번째 줄에는 각 학생의 MBTI 성격 유형을 나타내는 문자열들이 사이에 공백을 두고 주어진다.

 

출력


 

답을 한줄에 하나씩 출력

 

import sys

t = int(sys.stdin.readline())

def getDis(mbti1,mbti2): # mbti 거리 계산 함수
    dis = 0
    for i in range(4):
        if mbti1[i] != mbti2[i]:
            dis += 1

    return dis

def for3(mbtis,lenMbtis): # mbti 돌면서 가장 작은 거리 를 계산한다.
    minDis = 100001
    if lenMbtis > 48: # mbti의 개수가 16개 3개가 중복되면 48이다. 이때 48이상이면 무조건 3개가 중복되는 mbti 가 나오게 되므로 최소 거리는 0이다
        return 0
    for i1 in range(lenMbtis - 2): # mbti 3개를 하나하나 검사한다.
        for i2 in range(i1 + 1,lenMbtis - 1):
            for i3 in range(i2 + 1,lenMbtis):
                mbti1 = mbtis[i1]
                mbti2 = mbtis[i2]
                mbti3 = mbtis[i3]

                dis = getDis(mbti1,mbti2) + getDis(mbti2,mbti3) + getDis(mbti1,mbti3) # 3개의 mbti 거리공식을 이용하여 거리를 계산한다.
                minDis = min(dis,minDis) # 이중 최소 거리를 구한다.

    return minDis
    
for i in range(t): # 테스트 케이스 만큼 돈다
    n = int(sys.stdin.readline()) # mbti 의 개수
    
    mbtis = sys.stdin.readline().split() # mbti 를 리스트로 받는다.
    res = for3(mbtis,n) # 구한 mbti 의 최소거리를 res 에 넣고
    print(res) # 출력한다.