728x90
반응형
https://www.acmicpc.net/problem/3363
문제
여러분은 양팔 저울 하나와 동전 12개(1, 2, ..., 12 의 번호)를 가지고 있는데, 그 중 하나는 모조품입니다. 모조품은 다른 동전보다 가볍거나 무겁습니다.
양팔 저울로 세 번 측정하여 모조품을 찾고, 그것이 무거운지 가벼운지 밝히는 프로그램을 작성하세요.
입력
무게를 측정한 결과 데이터가 아래와 같은 형식의 표준 입력으로 주어지게 됩니다.
A B C D x E F G H
A, B, C, D, E, F, G, H 는 서로 다른 8 개의 동전들의 숫자이고, x 는 <, >, = 중에 하나입니다. 다음과 같은 의미를 지닙니다.
- < : A, B, C, D 의 총합은 E, F, G, H 의 총합보다 작다
- > : A, B, C, D 의 총합은 E, F, G, H 의 총합보다 크다
- = : A, B, C, D 의 총합은 E, F, G, H 의 총합과 같다
출력
프로그램은 표준출력에 모조품의 번호를 출력하고, 다른 동전보다 무거운 경우에는 + 를, 가벼운 경우에는 - 를 이어서 출력합니다.
세 번의 측정 데이터가 모순되는 경우에는 "impossible" 을 출력해야 합니다.
데이터가 모순되지는 않지만 모조품의 번호를 알아내기에 불충분하거나, 무거운지 가벼운지 알 수 없는 경우에는 "indefinite" 를 출력해야 합니다.
풀이
Code
import sys
input = sys.stdin.readline
def solution() :
# 1. 측정 정보 입력받기
array = [list(map(str, input().rstrip().split(' '))) for _ in range(3)]
# 2. 무거울 가능성, 가벼울 가능성이 있는 리스트 생성
big, small = set(list(map(str, range(1, 13)))), set(list(map(str, range(1, 13))))
# 3.
for _ in range(3) :
# 3-1.
for information in array :
# 3-1-1. 부등호가 있는 인덱스 찾기
idx = -1
for i in range(len(information)) :
if information[i] in ['<', '>', '='] :
idx = i
break
# 3-1-2. 부등호 위치를 기준으로 수 나누기
sign, info1, info2 = information[idx], set(information[:idx]), set(information[idx+1:])
# 3-1-3. '>'의 경우
if sign == '>' :
big = big & info1
small = small & info2
# 3-1-4. '<'의 경우
elif sign == '<' :
big = big & info2
small = small & info1
# 3-1-5. '='의 경우
else :
big = big - (info1 | info2)
small = small - (info1 | info2)
# 4. 결과 출력
if not big and not small : print('impossible')
elif not small and len(big) == 1 : print(f'{big.pop()}+')
elif not big and len(small) == 1 : print(f'{small.pop()}-')
else : print('indefinite')
if __name__ == "__main__":
solution()
728x90
반응형
'Coding Test > Baekjoon' 카테고리의 다른 글
[Python/BOJ] 16562. 친구비 (0) | 2023.11.24 |
---|---|
[Python/BOJ] 13270. 피보나치 치킨 (1) | 2023.11.23 |
[Python/BOJ] 6615. 콜라츠 추측 (0) | 2023.11.09 |
[Python/BOJ] 20058. 마법사 상어와 파이어스톰 (0) | 2023.11.05 |
[Python/BOJ] 17140. 이차원 배열과 연산 (0) | 2023.11.05 |