BOJ 14696: 딱지놀이
CUJ 4876: 딱지놀이

문제 읽어보기

  • 어린이 A, B가 4가지의 딱지를 가지고 쇼부를 보는 게임이다.
  • 별, 동그라미, 네모, 세모 순으로 쎄다. (자세한 내용은 문제를 읽는 것을 추천함)

아주 어려운 문제는 아니었던 것 같다. 맨날 boj 뭐시기 검색하면서 가이드라인만 주구장창 따라하면서 나중에 이해하곤 했는데, 이번 문제는 오로지 나만의 힘으로 풀어서 뿌듯하기도 하다.

사실 맨 처음에, 예시 입력을 보았을 때 조금 헷갈렸다. 하지만, 차근차근 읽어보니 쉽게 이해할 수 있었다.

  • 1번째 줄: 라운드 횟수 (N)
  • 2번째 줄 (A의 딱지):
    • 1번째 숫자: 어린이 A의 낸 딱지의 수
    • 2번째 숫자 ~ 마지막 숫자: 어린이 A가 낸 딱지
  • 3번째 줄 (B의 딱지):
    • 1번째 숫자: 어린이 B의 낸 딱지의 수
    • 2번째 숫자 ~ 마지막 숫자: 어린이 B가 낸 딱지
  • 이후로 라운드 횟수에 맞춰 2번째 줄과 3번째 줄이 번갈아 나온다.

문제 풀어보기

입력 부분 만들기

예시 입력을 보아하니, 입력 부분을 처리하는 것도 꽤나 귀찮을 것 같았다. 그래서, 맨 처음에는 함수를 하나 짜서 재사용할 수 있도록 해두었다.

def cards(card_list):  # Input: Map Object
    cards_count = [0, 0, 0, 0]
    ls = list(card_list)
    card_number = ls.pop(0)
    for i in range(card_number):
        cards_count[ls[i] - 1] += 1
    return cards_count.reverse()  # To prevent reversed-list problem

.
.
.

A_cards = cards(map(int, input().split()))

맨 밑의, A_cards를 입력받을 때, map 함수를 이용하여 모든 데이터를 한번에 받아오도록 한다.
단, 명심할 점은 Map Object로 반환되기 때문에, list 함수로 하여금 Map Object를 List Object로 변경하였다.
그리고, Counting을 용이하게 할 수 있도록 각 줄 맨 처음에 있는 딱지의 개수를 pop 함수로 따로 담아두었고, 나머지의 값을 Index Counting을 이용하여 cards_count 리스트에 딱지의 개수를 입력하였다.
마지막으로, 별부터 비교할 때 별(4)이 맨 뒤에 있으면 조금 귀찮으므로, reverse 함수를 쓰고 리턴해준다.

쇼부 부분 만들기

딱히 특별히 언급할 것은 없다. 그저 비교하는 함수.

def shobu(A_cards, B_cards):
    for i in range(4):
        if A_cards[i] > B_cards[i]:  # A win -> return 1
            return 1
        elif A_cards[i] < B_cards[i]:  # B win -> return -1
            return -1
    return 0  # Draw -> return 0

이때 평소와는 살짝 다른 방식으로 값을 저장했는데, 외부에 history라는 list를 만들어 append를 시켰다. 마지막에 차례대로 출력시키면 될 것이다.

출력 부분 만들기

for his in history:
    if his == 1:
        print('A')
    elif his == -1:
        print('B')
    else:
        print('D')

정말로 간단하다. 방금 언급했던 history를 이용하여 저장된 값을 A, B, D로 바꾸어 출력토록 하였다.
이로써 문제는 풀렸다. 중간중간 나오지 못한 코드를 포함하여 전체 코드를 공개하려고 한다.

전체 코드

def cards(card_list):  # Input: Map Object
    cards_count = [0, 0, 0, 0]
    ls = list(card_list)
    card_number = ls.pop(0)
    for i in range(card_number):
        cards_count[ls[i] - 1] += 1
    return cards_count.reverse()  # To prevent reversed-list problem


def shobu(A_cards, B_cards):
    for i in range(4):
        if A_cards[i] > B_cards[i]:  # A win -> return 1
            return 1
        elif A_cards[i] < B_cards[i]:  # B win -> return -1
            return -1
    return 0  # Draw -> return 0


history = []

N = int(input())

for i in range(N):
    A_cards = cards(map(int, input().split()))
    B_cards = cards(map(int, input().split()))
    history.append(shobu(A_cards, B_cards))

for his in history:
    if his == 1:
        print('A')
    elif his == -1:
        print('B')
    else:
        print('D')

회고

  • .reverse() 함수를 이상하게 써버려서 조금 시간이 지연되고 말았다.
    • a = a.reverse()로 써놓고 '어? 왜 None값이 뜨는 거지?' 하고 있었다...
    • Debug를 돌린 상태로 다시 가이드를 참고하니, 반환값이 없는 함수라는 것을 보고 조금 슬펐다.
    • 다행히 1시간 이상 날린 정도는 아니나, 그래도 곰씹을만한 포인트 정도가 되었다.