백준 11507번: 카드셋트

최창효·2022년 1월 19일
0
post-thumbnail


문제 설명

  • 가지고 있는 카드의 정보가 하나의 문자열로 들어옵니다.
  • 똑같은 카드를 가지고 있다면 "GRESKA"를 출력합니다.
  • 똑같은 카드가 없다면 각 모양별로 부족한 카드의 개수를 출력해야 합니다.

접근법

  • 카드 하나의 정보의 길이는 3입니다. 문자열을 3개씩 나누면 가지고 있는 모든 카드를 list로 얻을 수 있습니다.
  • 중복카드가 존재하는지는 set()을 통해 알 수 있습니다. set(List)는 List에서 유일한 원소들만 가진 집합 자료형을 반환합니다.
    • 만약 List에 중복되는 카드가 존재하지 않는다면 List의 값과 set의 값을 동일할 것입니다.
    • 완벽한 세트 - 내가 가진 카드 = 잃어버린 카드 입니다.

정답

s = input()
#s를 3개씩 잘라 lst에 담습니다
lst = []
for i in range(0,len(s)-2,3):
    lst.append(s[i:i+3])


#똑같은 카드가 존재하는지 확인합니다
if len(set(lst)) != len(lst):
    print("GRESKA")
else: #똑같은 카드가 존재하지 않으면
    #모든 카드 - 내가 가진 카드 = 잃어버린 카드
    answer = {"P":13,"K":13,"H":13,"T":13}#모든 세트가 온전할 경우입니다 
    for l in lst:
        card_shape = l[0] #l[0]은 카드의 모양을 나타냅니다
        answer[card_shape]-=1

기타

  • 문자열 s를 num개씩 자르는 내장함수 wrap을 사용할 수도 있습니다.
from textwrap import wrap
lst = wrap(s,num)
  • 한자리 수 카드정보가 0이 없이 들어왔다면 해당 코드로 문제를 풀 수 없습니다.
    • isalpha()를 통해 문자와숫자 여부를 파악하고, 문자열을 기준으로 전체s를 나눌 수 있습니다.
    • 더 효율적인 코드가 당장은 생각나지 않아, 문자의 인덱스를 저장한 후 해당 인덱스로 값을 나누는 코드를 적어봤습니다.
s = "A1B22C3333D44444444"
idx = []
for i in range(len(s)):
    if s[i].isalpha():
        idx.append(i)
idx.append(len(s))

lst = []
for i in range(len(idx)-1):
    lst.append(s[idx[i]:idx[i+1]])
print(lst)
profile
기록하고 정리하는 걸 좋아하는 백엔드 개발자입니다.

0개의 댓글

관련 채용 정보