본문 바로가기
Algorithm/etc

[파이썬] 백준 20529: 가장 가까운 세 사람의 심리적 거리 (실버1)

by 베짱이28호 2023. 6. 21.

[파이썬] 백준 20529: 가장 가까운 세 사람의 심리적 거리 (실버1)

 

 

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

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

www.acmicpc.net


문제


풀이

0.방향성 생각

입력을 받으면서 특정 성격의 개수가 3개가 넘어가면 바로 0을 출력하고 넘어가게 만든다.

비둘기집 원리가 뭔지 몰라도 풀 수 있다. 풀고 태그 찾아봤는데 이런게 있구나 정도면 될듯

사람 수가 많아지면 각 mbti별로 테스트 케이스가 쌓이는데 n=32를 넘어가면 무조건 하나의 케이스에서 같은 성격이 3개 이상이 발생하는 것을 생각할 수 있다.

10**5까지 들어오니까 n>32인 경우는 그냥 잘라낸다. 그 밑의 경우만 잘 세주면 된다.

 

1. 입력 받기. 케이스 나누기

from itertools import combinations
import sys
input = sys.stdin.readline

mbtis = ['ISTJ', 'ISFJ', 'INFJ', 'INTJ',
        'ISTP', 'ISFP', 'INFP', 'INTP',
        'ESTP', 'ESFP', 'ENFP', 'ENTP',
        'ESTJ', 'ESFJ', 'ENFJ', 'ENTJ']

t = int(input())
for i in range(t):
    table = {mbti : 0 for mbti in mbtis}
    n = int(input())
    temp = input().split()
    if n>32 :
        print(0)
        continue

n>32 일 때는 0 출력하고 다음 테스트 케이스로 넘긴다.

 

2. 따로 계산해야 하는 경우

    else :
        for mbti in temp :
            table[mbti] += 1
            if table[mbti] == 3:
                print(0)
                break
        else :
            temp = list(combinations(temp,3))
            score_list = []
            for comb in temp :
                score = 0
                for i in range(4):
                    if (comb[0][i] == comb[1][i] and
                        comb[0][i] == comb[2][i] and
                        comb[1][i] == comb[2][i]) :
                        score += 0
                    else :
                        score += 2
                score_list.append(score)
            print(min(score_list))

들어온 입력 mbti 리스트를 돌려서 테이블에 넣는다. 이 때 특정 성격의 사람 수가 3명이 되면 탈출한다.

for else문으로 제어해서 탈출할 경우 바로 다음 테스트 케이스로 넘어간다.

 

전체 케이스에서 특정 성격의 사람 수가 3명이 되지 않는 경우는 직접 계산한다.

3중 for문을 쓰거나 combinations를 사용해서 3개를 뽑고 계산한다.

점수를 계산할 때 III나 EEE나 0점이고 IIE나 IEE는 2점이다. 두 가지 케이스만 존재한다.

점수를 계산해주고 score list에 현재 케이스에 대한 점수를 넣는다.

그 점수 리스트에서 최소값 출력


전체코드

from itertools import combinations
import sys
input = sys.stdin.readline

mbtis = ['ISTJ', 'ISFJ', 'INFJ', 'INTJ',
        'ISTP', 'ISFP', 'INFP', 'INTP',
        'ESTP', 'ESFP', 'ENFP', 'ENTP',
        'ESTJ', 'ESFJ', 'ENFJ', 'ENTJ']

t = int(input())
for i in range(t):
    table = {mbti : 0 for mbti in mbtis}
    n = int(input())
    temp = input().split()
    if n>32 :
        print(0)
        continue
    else :
        for mbti in temp :
            table[mbti] += 1
            if table[mbti] == 3:
                print(0)
                break
        else :
            temp = list(combinations(temp,3))
            score_list = []
            for comb in temp :
                score = 0
                for i in range(4):
                    if (comb[0][i] == comb[1][i] and
                        comb[0][i] == comb[2][i] and
                        comb[1][i] == comb[2][i]) :
                        score += 0
                    else :
                        score += 2
                score_list.append(score)
            print(min(score_list))

 

코멘트

테스트 케이스 밖에서 table 정의해서 틀린거랑 중첩 for문 break 제어에서 실수한거 빼고는 빼고는 쉽게 풀었다.

while else, for else문을 사용해서 제어했다.

안썼으면 break 0으로 탈출하고 brk = True 이런식으로 변수하나 작성해서 탈출한  for문 밑에 작성했을 텐데 가독성도 좋고 연습해야될듯.

댓글