Computer Science/코딩테스트 문제 풀이
[N시간만에 끝내는 Python 코딩테스트] 3편 2018 카카오 코딩테스트 2번 다트게임 (with 정규표현)
4356
2023. 12. 24. 18:26
https://school.programmers.co.kr/learn/courses/30/lessons/17682
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
https://www.youtube.com/watch?v=vn88ltwL9ZU
간단한 구현 문제인데, import re, 정규표현식을 알게 되었다.
방법 1
def solution(dartResult):
answer = []
for i, info in enumerate(dartResult, 1): # 시작 i를 1부터 세기
if info == 'S':
answer[-1] **= 1
elif info == 'D':
answer[-1] **= 2
elif info == 'T':
answer[-1] **= 3
elif info == '*':
answer[-1] *= 2
if len(answer) >= 2:
answer[-2] *= 2
elif info == '#':
answer[-1] *= -1
else:
if dartResult[i-1:i+1] == '10':
answer.append(10)
elif dartResult[i-2:i] != '10':
answer.append(int(info))
# else:
# answer.append(int(info))
return sum(answer)
arr = '1D2S3T*'
solution(arr)
방법 2
import re
testcase = ['1S2D*3T', '1D2S#10S']
pattern = re.compile(r'([0-9]|10)([SDT])([\*\#]?)')
print(pattern.findall(testcase[0]))
print(pattern.findall(testcase[1]))
>>>
[('1', 'S', ''), ('2', 'D', '*'), ('3', 'T', '')]
[('1', 'D', ''), ('2', 'S', '#'), ('10', 'S', '')]
이렇게 나오는 것을 알았으니 최종 코드에 적용해보면
import re
def solution(dartResult):
pattern = re.compile(r'([0-9]|10)([SDT])([\*\#]?)')
answer = []
calMap = {
'S': lambda x: x,
'D': lambda x: x**2,
'T': lambda x: x**3
}
for num, bon, op in pattern.findall(dartResult):
val = calMap[bon](int(num)) # 딕셔너리에 함수를 넣어 (int(num))으로 입력 받는다
if op == '*':
val *= 2
if answer: # 이미 계산된 숫자가 있으면
answer[-1] *= 2 # 얻은 점수도 *2를 해준다
elif op == '#':
val *= -1
answer.append(val)
return sum(answer)
arr = '1D2S3T*'
solution(arr)
딕셔너리에 함수를 넣는것 (lambda) 와
import re 정규 표현식을 알게 되었다