백준

[BOJ/python] 25186번 INFP 두람

LUNAV 2022. 6. 6. 00:22

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

 

25186번: INFP 두람

옷의 총개수는 C++의 32비트 int 자료형의 최댓값인 2,147,483,647을 초과할 수도 있다.

www.acmicpc.net

문제 해석

첫 번째 줄에는 옷의 종류를, 두 번째 줄에는 종류별 옷의 개수를 입력한다.
옷의 총 개수는 친구들의 개수와 같다.

원형으로 둘러섰을 때 이웃한 사람과 옷이 겹치지 않으면 Happy를, 겹치면 Unhappy를 출력한다.


코드

 

def infp():
    check = 'Happy'

    n = int(input())
    cloth_list = list(map(int, input().split())) # 두번째 줄에서 입력받은 수들로 리스트 생성

    check_cloth = int(sum(cloth_list) / 2) # [인원수 / 2]
    
    for i in range(len(cloth_list)): 
        if check_cloth < cloth_list[i]:
            if n == 1:
                if cloth_list[i] == 1:
                    continue
                else:
                    check = 'Unhappy'
                    break
            else:
                check = 'Unhappy'
    return check

print(infp())

문제 풀이

예제 입력만 먼저 살펴 보자.

예제 입력 1을 먼저 보면

5

1 5 4 1 2가 입력된 것을 볼 수 있다.

옷의 종류를 각각 1, 2, 3, 4, 5라고 했을때, 옷의 총 개수가 사람의 개수이므로

 

1(1명)

2, 2, 2, 2, 2(5명)

3, 3, 3, 3(4명)

4(1명)

5, 5(2명)

 

만큼 사람이 있는 것이다.

원형으로 둘러 섰을 때, 이웃한 사람이 옷이 겹치지 않으려면 그 어떤 종류의 옷을 입은 사람도 [총 사람의 개수 / 2] 명을 넘어서는 안된다. (여기서 []는 가우스 함수)

또한 N = 1일 때 d1 > 1인지, d1 = 1인지도 구분을 해야 한다(d1 > 1이면 Unhappy 이지만, d1 = 1이면 Happy 이기 때문이다.)