백준 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)

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • A = [int(i) for i in list(map(int, input().split()))]인 이유가 있나요?? 코드 실행시 L을 어떤 형식으로 입력받는 거죠?? 초보자 2021.4.23 12:06

1 답변

  • 일단, 다음 전개를 봐주세요.

    def getWinner(A, B) :
    
        if (별 갯수가 다름) :
    
            # 이 시점에서 사실은 이미 쇼부가 났음
            # 누가 이긴 건지만 알아내서 반환하고 끝내면 됨
    
            return 별을 더 많이 가진 사람
    
        # 여기까지 왔을 땐 별 갯수 때문에 쇼부가 나진 않은 상태
        # 더 봐야 함
    
        if (동그라미 갯수가 다름) :
            return 동그라미를 더 많이 가진 사람
    
        # 이하 생략
    
        # 여기까지 오면 누가 승자인지 알 수가 없음
        # 이때는 기본값을 반환
        return "무승부"
    

    현재 코드의 리팩토링 자체는 위 전개가 이해가 된다면 별로 어려운 부분이 없을 것입니다.


    여기까지는 재미없는 답변이고, 좀 재미있는 걸 생각해 봅시다. 초등부라고 해도, 엔지니어링 문제를 해결하는 중에 있다면, 코드가 복잡해지고 있을 때는, 아 이거 혹시 무슨 공식이 있는 거 아닐까?를 생각하실 수 있어야 합니다.

    혹시 이 문제에 공식이 있을까요? 한번 유도해 봅시다. 문제에 따르면:

    • 만약 두 딱지의 별의 개수가 다르다면, 별이 많은 쪽의 딱지가 이긴다.
    • 별의 개수가 같고 동그라미의 개수가 다르다면, 동그라미가 많은 쪽의 딱지가 이긴다.
    • 별, 동그라미의 개수가 각각 같고 네모의 개수가 다르다면, 네모가 많은 쪽의 딱지가 이긴다.
    • 별, 동그라미, 네모의 개수가 각각 같고 세모의 개수가 다르다면, 세모가 많은 쪽의 딱지가 이긴다.
    • 별, 동그라미, 네모, 세모의 개수가 각각 모두 같다면 무승부이다.

    이걸 딱 보고 들었던 생각은, '이거 자릿수 개념인데...'라는 겁니다. 아주 간단히 생각해 보자면:

    • 별 = 천의 자리
    • 동그라미 = 백의 자리
    • 네모 = 십의 자리
    • 세모 = 일의 자리

    라고 했을 때, 세모가 30개 그려진 카드를 내보아야 별 하나 그려진 카드를 이기지 못하죠.

    문제 조건을 좀더 들여다보면, 딱지 한 장에는 그림이 최대 100개 들어갈 수 있고, 더 낮은 계급의 그림이 아무리 많아도 더 높은 계급의 그림이 모자란 딱지라면 무조건 패배하게 되어 있으므로:

    • 세모 = 1
    • 네모 = 세모 * 100 + 1점 (당연한 겁니다. 세모 100개만 그려진 딱지는 네모 하나만 그려진 딱지에 못 이기니까요.)
    • 동그라미 = 네모 * 100 + 1
    • 별 = 동그라미 * 100 + 1

    의 가산점으로 계산하면 얼추 되지 않을까 싶은데 어떠세요? 일단은 과제를 해결하시고, 이후에 한번 생각해 보세요!

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)