백준 KOI 초등부 14696번 딱지놀이 조건문 질문입니다.
조회수 463회
안녕하세요 백준 KOI 초등부 14696번 딱지놀이 문제에서 무승부일 때, D라는 결과를 출력하고 싶은데 None이라는 결과가 뜹니다 return 때문인 거 같은데 어떻게 무승부 결과를 뽑을 수 있을까요
그리고 제 다중 조건문 코드가 너무 복잡하고 조건문을 타고 내려가는 부분에 대한 이해가 부족한 것 같아요 어떻게 효율적으로 수정할 수 있을 지 궁금합니다.
다른 분의 코드를 참고하고 있지만 제가 작성한 코드 피드백 받고 싶어서 질문 올립니다. 감사합니다 :)
# 입력
L = int(input()) # 총 라운드 수
round = []
for i in range(2*L):
A = [int(i) for i in list(map(int, input().split()))]
round.append(A) # 라운드마다 A, B의 카드
# 카드의 모양의 번호
# star = 4
# circle = 3
# square = 2
# triangle = 1
def Battle_AB(round): # 개수 비교
for i in range(0, L):
if round[i][1:].count(4) != round[i + 1][1:].count(4): # 별 개수가 다르다면
if round[0][1:].count(4) > round[i + 1][1:].count(4):
result = 'A'
print(result)
else:
result = 'B'
print(result)
elif round[i][1:].count(4) == round[i + 1][1:].count(4): # 별 개수가 같다면
if round[i][1:].count(3) > round[i + 1][1:].count(3):
result = 'A'
print(result)
elif round[i][1:].count(3) == round[i + 1][1:].count(3):
return
else:
result = 'B'
print(result)
if round[i][1:].count(3) == round[i + 1][1:].count(3): # 동그라미 개수가 같다면
if round[i][1:].count(2) > round[i + 1][1:].count(2):
result = 'A'
elif round[i][1:].count(2) == round[i + 1][1:].count(2):
return
else:
result = 'B'
print(result)
if round[i][1:].count(2) == round[i + 1][1:].count(2): # 네모 개수가 같다면
if round[i][1:].count(1) > round[i + 1][1:].count(1):
result = 'A'
print(result)
elif round[i][1:].count(1) == round[i + 1][1:].count(1):
result = 'D'
print(result)
else:
result = 'B'
print(result)
i += 2
return result
# 실행
ab = Battle_AB(round)
print(ab)
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
일단, 다음 전개를 봐주세요.
def getWinner(A, B) : if (별 갯수가 다름) : # 이 시점에서 사실은 이미 쇼부가 났음 # 누가 이긴 건지만 알아내서 반환하고 끝내면 됨 return 별을 더 많이 가진 사람 # 여기까지 왔을 땐 별 갯수 때문에 쇼부가 나진 않은 상태 # 더 봐야 함 if (동그라미 갯수가 다름) : return 동그라미를 더 많이 가진 사람 # 이하 생략 # 여기까지 오면 누가 승자인지 알 수가 없음 # 이때는 기본값을 반환 return "무승부"
현재 코드의 리팩토링 자체는 위 전개가 이해가 된다면 별로 어려운 부분이 없을 것입니다.
여기까지는 재미없는 답변이고, 좀 재미있는 걸 생각해 봅시다. 초등부라고 해도, 엔지니어링 문제를 해결하는 중에 있다면, 코드가 복잡해지고 있을 때는, 아 이거 혹시 무슨 공식이 있는 거 아닐까?를 생각하실 수 있어야 합니다.
혹시 이 문제에 공식이 있을까요? 한번 유도해 봅시다. 문제에 따르면:
- 만약 두 딱지의 별의 개수가 다르다면, 별이 많은 쪽의 딱지가 이긴다.
- 별의 개수가 같고 동그라미의 개수가 다르다면, 동그라미가 많은 쪽의 딱지가 이긴다.
- 별, 동그라미의 개수가 각각 같고 네모의 개수가 다르다면, 네모가 많은 쪽의 딱지가 이긴다.
- 별, 동그라미, 네모의 개수가 각각 같고 세모의 개수가 다르다면, 세모가 많은 쪽의 딱지가 이긴다.
- 별, 동그라미, 네모, 세모의 개수가 각각 모두 같다면 무승부이다.
이걸 딱 보고 들었던 생각은, '이거 자릿수 개념인데...'라는 겁니다. 아주 간단히 생각해 보자면:
- 별 = 천의 자리
- 동그라미 = 백의 자리
- 네모 = 십의 자리
- 세모 = 일의 자리
라고 했을 때, 세모가 30개 그려진 카드를 내보아야 별 하나 그려진 카드를 이기지 못하죠.
문제 조건을 좀더 들여다보면, 딱지 한 장에는 그림이 최대 100개 들어갈 수 있고, 더 낮은 계급의 그림이 아무리 많아도 더 높은 계급의 그림이 모자란 딱지라면 무조건 패배하게 되어 있으므로:
- 세모 =
1
점 - 네모 =
세모 * 100 + 1
점 (당연한 겁니다. 세모 100개만 그려진 딱지는 네모 하나만 그려진 딱지에 못 이기니까요.) - 동그라미 =
네모 * 100 + 1
점 - 별 =
동그라미 * 100 + 1
점
의 가산점으로 계산하면 얼추 되지 않을까 싶은데 어떠세요? 일단은 과제를 해결하시고, 이후에 한번 생각해 보세요!
댓글 입력