난이도 : D3
문제번호 : 4047
※ 저의 풀이가 무조건적인 정답은 아닙니다.
다른 코드가 좀더 효율적이고 좋을 수 있습니다.
다른사람들의 풀이는 언제나 참고만 하시기 바랍니다.
문제 주소 및 출처입니다.
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
목차
1. 문제 설명
2. 문제 해석
3. 소스 코드
1. 문제 설명
최근 영준이는 카드 게임에 꽂혀 있다. 영준이가 하는 카드 게임에는 한 덱의 카드가 필요한데 여기서 얘기하는 “한 덱”이란 스페이드, 다이아몬드, 하트, 클로버 무늬 별로 각각 A, 2~10, J, Q, K의 라벨 즉 4개의 무늬 별로 각각 13장씩 총 52장의 카드가 있는 모음을 의미한다. 편의상 A는 1, J, Q, K는 11, 12, 13으로 하여 1~13의 숫자가 카드에 적혀있다고 하자. 영준이는 몇 장의 카드를 이미 가지고 있는데 게임을 하기 위해서 몇 장의 카드가 더 필요한지 알고 싶어 한다. 그리고 이미 겹치는 카드를 가지고 있다면 오류를 출력하고자 한다. 지금 가지고 있는 카드의 정보가 주어지면 이 작업을 수행하는 프로그램을 작성하라. |
입력
맨 위 줄에 테스트케이스의 개수가 주어진다. |
출력
각 테스트케이스 별로 순서대로 한 줄씩 답을 출력하는데, 문자열 S를 보고 지금 무늬 별로(S, D, H, C 순서로) 몇 장의 카드가 부족한지 출력하여라. |
예시
입력 | 출력 |
3 |
#1 12 12 11 13 #2 ERROR #3 12 12 12 12 |
2. 문제풀이
딕셔너리를 이용하여 쉽게 풀었다. 입력받은 값을 3개씩 끊어 리스트에 넣고 set으로 중복을 검사했다. 만약 길이가 다르다면 중복이 있으므로 에러를 출력한다. set으로 바꿧음에도 길이가 같다면 중복이 없으므로 제일 첫글자만 보면서 딕셔너리에서 갯수를 감소시킨다. 모든 반복이 끝나면 딕셔너리의 각 벨류값을 출력한다. |
3. 소스코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#D3 4047 영준이의 카드 카운팅
#카드 리스트 셋팅
for t in range(1, int(input())+1):
t_str = input()
t_lst = []
#카드갯수
counts = {'S': 13, 'D': 13, 'H': 13, 'C' : 13}
#3칸씩 분리해서 저장
for i in range(0, len(t_str), 3): t_lst.append(t_str[i:i+3])
#겹치는게 있다면 에러 출력
if len(set(t_lst)) != len(t_lst): print("#{} ERROR".format(t))
#안겹치면 카드깍고 원소 출력
else:
for k in t_lst: counts[k[0]] -= 1
print("#{} ".format(t), end='')
print(*counts.values())
|
댓글