백준 - 20529

GGob2._.·2023년 9월 4일
0

algorithm

목록 보기
43/55

문제 설명

N명의 MBTI가 주어졌을 때, 가장 적게 차이가 나는 3명을 선택하는 문제로, 여기서 차이는 MBTI의 각 항목이 다름을 의미한다.

예) ESTP <-> INFJ는 모두 다르기 때문에 차이가 4다.


접근 방법

  1. 무작정 완전 탐색을 수행하려다가, N이 100,000까지 나올 수 있어 다른 방법을 생각

  2. MBTI는 각 항목의 경우가 2개씩 존재하여 16개의 특성이 존재.
    N이 32가 넘어가면, 동일한 MBTI를 가지는 사람이 최소 3명 존재
    (N이 16이 될 떄 마다 모든 MBTI는 1번씩 나올 수 있기 떄문)

  3. N이 32보다 큰 경우에는 0 출력, 그렇지 않은 경우에는 완전탐색 수행

  4. i j k로 3개의 인덱스를 생성하여 3중 중첩 for문으로 모든 경우를 탐색 (i j k가 같은 경우에는 탐색 생략)

  5. result 변수에 현재까지 가장 작게 나온 경우를 집어넣고, min 구문을 이용해 더 작은 경우가 나오는 경우 변경

작성한 코드

import sys

input = sys.stdin.readline

test_case = int(input())

for i in range(test_case):
     
    n = int(input())
    result = 13
    mbti_list = list(map(str, input().split()))
    
    if n > 32:  # n이 32가 넘어가게 되면 동일한 mbti가 최소 3명
        print(0)
    
    else:
        for i in range(n):
            for j in range(n):
                for k in range(n):
                    if i == j or j == k or i == k:
                        continue
                    tmp = 0
                    for _ in range(4):
                        if mbti_list[i][_] != mbti_list[j][_]: 
                            tmp += 1
                        if mbti_list[j][_] != mbti_list[k][_]: 
                            tmp += 1
                        if mbti_list[i][_] != mbti_list[k][_]: 
                            tmp += 1
                    result = min(result, tmp)
        print(result)

실수한 부분

처음 채점할 떄, ValueError가 발생했다. 그 이유가 뭘까

import sys

input = sys.stdin.readline

test_case = int(input())

for i in range(test_case):
     
    n = int(input())
    result = 13
    
    
    if n > 32:  # n이 32가 넘어가게 되면 동일한 mbti가 최소 3명
        print(0)
    
    else:
    
   		mbti_list = list(map(str, input().split())) # <<< 에러 발생
    	
        for i in range(n):
            for j in range(n):
                for k in range(n):
                    if i == j or j == k or i == k:
                        continue
                    tmp = 0
                    for _ in range(4):
                        if mbti_list[i][_] != mbti_list[j][_]: 
                            tmp += 1
                        if mbti_list[j][_] != mbti_list[k][_]: 
                            tmp += 1
                        if mbti_list[i][_] != mbti_list[k][_]: 
                            tmp += 1
                    result = min(result, tmp)
        print(result)

위 코드에서와 같이 MBTI를 받는 경우를 else문 밑에 작성해서

n = int(input())

의 입력으로 mbti가 입력되어 에러가 발생했다.

profile
소통을 잘하는 개발자가 되고 싶습니다.

0개의 댓글