Stay Hungry Stay Foolish

SWEA

[SWEA] 4047. 영준이의 카드 카운팅 (Python/D3)

dev스카이 2024. 11. 14. 01:44

[문제 링크] 👇

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


풀이 방법

카드 입력 분할 및 초기화

S, D, H, C = [0]*13, [0]*13, [0]*13, [0]*13
  • S, D, H, C의 네 가지 무늬에 대해 각각 13칸짜리 리스트를 만든다.
  • 각 리스트는 13개의 인덱스를 가지며, 각 인덱스는 카드 번호(1~13)에 대응되도록 한다.

카드 읽고 카운팅

 for i in range(0, len(card), 3):
        shape = card[i]  # 카드 종류
        num = int(card[i + 1:i + 3])  # 카드 수
        ...
  • 카드 입력 문자열을 3글자씩 슬라이싱해 카드의 무늬와 번호를 추출한다.
  • 무늬에 따라 해당 리스트의 카드 번호 위치에 1을 추가한다.

중복 확인

  • 카드 리스트를 확인해 2 이상의 값이 있는 경우, 해당 카드가 중복임을 의미하므로 ERROR를 출력하도록 설정한다.

남은 카드 개수 계산

result = [S.count(0), D.count(0), H.count(0), C.count(0)]
  • 중복이 없다면 0 값이 남은 카드 수이므로, 각 무늬별로 남은 카드 수를 계산하고 출력한다.

Solution

T = int(input())  # 테스트 케이스 수
for test_case in range(1, T + 1):
    card = input().strip()
    S, D, H, C = [0]*13, [0]*13, [0]*13, [0]*13
    for i in range(0, len(card), 3):
        shape = card[i]  # 카드 종류
        num = int(card[i + 1:i + 3])  # 카드 수
        if shape == 'S': 
            S[num - 1] += 1
        elif shape == 'D':
            D[num - 1] += 1
        elif shape == 'H':
            H[num - 1] += 1
        elif shape == 'C':
            C[num - 1] += 1

    result = [S, D, H, C]
    error = ""
    for i in result:
        for j in i:
            if j > 1:
                error = "ERROR"
                break

    result = [S.count(0), D.count(0), H.count(0), C.count(0)]
    if error == "":
        print(f"#{test_case}", *result)
    else:
        print(f"#{test_case} {error}")

 

 

개선 포인트

  • 중복 카드 검출 방식
    • if j > 1로 한 번이라도 중복이 발견되면 바로 "ERROR"를 출력할 수 있도록 루프를 탈출하면 불필요한 계산을 줄일 수 있다.
  • 카드 중복 확인 방식 변경
    • 개수를 직접 세는 대신, 집합을 사용해 중복을 쉽게 확인할 수 있다. 중복이 없으면 집합에 추가하고, 중복이 발생하면 즉시 "ERROR"를 출력하는 방식이다.
  • 카드 개수 카운트 방식 단순화
    • 각 카드에 대해 카운트만 증가시키면 되므로 배열 대신 set과 dict를 사용해 처리할 수 있다.

개선된 코드

T = int(input())  # 테스트 케이스 수
for test_case in range(1, T + 1):
    card = input().strip()
    card_set = set()
    card_count = {'S': 13, 'D': 13, 'H': 13, 'C': 13}
    error = False

    for i in range(0, len(card), 3):
        shape = card[i]
        num = int(card[i + 1:i + 3])
        card_key = (shape, num)
        
        if card_key in card_set:
            error = True
            break
        card_set.add(card_key)
        card_count[shape] -= 1

    if error:
        print(f"#{test_case} ERROR")
    else:
        print(f"#{test_case}", card_count['S'], card_count['D'], card_count['H'], card_count['C'])