[문제 링크] 👇
풀이 방법
카드 입력 분할 및 초기화
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'])
'SWEA' 카테고리의 다른 글
[SWEA] 9280. 진용이네 주차타워 (Python/D3) (0) | 2024.11.14 |
---|---|
[SWEA] 16800. 구구단 걷기 (Python/D3) (0) | 2024.11.14 |
[SWEA] 3260. 두 수의 덧셈 (Python/D3) (1) | 2024.11.14 |
[SWEA] 1873. 상호의 배틀필드 (Python/D3) (2) | 2024.11.13 |
[SWEA] 10580. 전봇대 (Python/D3) (1) | 2024.11.13 |