코딩테스트 연습 - [1차]다트게임
다트게임의 점수계산 로직을 완성해 0~10의 정수와 문자 S, D, T, *, #로 구성된 문자열이 입력될 시 총점수를 반환하는 함수를 작성하라.
합계: 84.4 / 100.0 : 테스트 4,6,7 실패 / 5,8 런타임에러
0점과 10점을 구분못해서 런타임에러가 존재한다.
def solution(dartResult): # 0점 10점 구분 x
answer = []
idx = 0
for i in dartResult:
if i == '0':
if answer[idx-1] == 1:
answer[idx-1] = 10
if i.isdecimal():
answer.append(int(i))
idx += 1
elif i == '*':
if len(answer) == 1:
answer[idx-1] = answer[idx-1] *2
else:
answer[idx-2] = answer[idx-2]*2
answer[idx-1] = answer[idx-1]*2
elif i == '#':
answer[idx-1] = answer[idx-1]*(-1)
elif i == 'S':
answer[idx-1] = answer[idx-1]**1
elif i == 'D':
answer[idx-1] = answer[idx-1]**2
elif i == 'T':
answer[idx-1] = answer[idx-1]**3
print(answer)
result = sum(answer)
return result
합계: 87.5 / 100.0 : 테스트 4,5,6,7 실패
10점인 경우가 아직 문제를 일으키는 것 같다. 천천히 다시 생각해봐야겠다.
def solution(dartResult):
answer = []
idx = 0
for index, i in enumerate(dartResult):
if i == '0':
if dartResult[index-1].isdecimal():
answer[idx-1] = 10
if i.isdecimal():
answer.append(int(i))
idx += 1
elif i == '*':
if len(answer) == 1:
answer[idx-1] = answer[idx-1] *2
else:
answer[idx-2] = answer[idx-2]*2
answer[idx-1] = answer[idx-1]*2
elif i == '#':
answer[idx-1] = answer[idx-1]*(-1)
elif i == 'S':
answer[idx-1] = answer[idx-1]**1
elif i == 'D':
answer[idx-1] = answer[idx-1]**2
elif i == 'T':
answer[idx-1] = answer[idx-1]**3
print(answer)
result = sum(answer)
return result
문제점 : 10점이 연속으로 나오는 경우 10만 저장해야되는데 조건식을 잘못세워 10과 0을 저장해 테스트케이스를 통과하지 못했다.
def solution(dartResult):
answer = []
idx = 0
for index, i in enumerate(dartResult):
if i.isdecimal():
if i == '0' and dartResult[index-1] == '1':
answer[idx-1] = 10
else:
answer.append(int(i))
idx += 1
elif i == '*':
if len(answer) == 1:
answer[idx-1] = answer[idx-1] *2
else:
answer[idx-2] = answer[idx-2]*2
answer[idx-1] = answer[idx-1]*2
elif i == '#':
answer[idx-1] = answer[idx-1]*(-1)
elif i == 'S':
answer[idx-1] = answer[idx-1]**1
elif i == 'D':
answer[idx-1] = answer[idx-1]**2
elif i == 'T':
answer[idx-1] = answer[idx-1]**3
result = sum(answer)
return result
import re
def solution(dartResult):
bonus = {'S' : 1, 'D' : 2, 'T' : 3}
option = {'' : 1, '*' : 2, '#' : -1}
p = re.compile('(\d+)([SDT])([*#]?)')
dart = p.findall(dartResult)
for i in range(len(dart)):
if dart[i][2] == '*' and i > 0:
dart[i-1] *= 2
dart[i] = int(dart[i][0]) ** bonus[dart[i][1]] * option[dart[i][2]]
answer = sum(dart)
return answer
특정한 규칙을 가진 문자열의 패턴을 표현하는 데 사용하는 표현식.
ex) 문자열 검색, 날짜, 전화번호 등
re.compile(문자열) : 정규식 패턴을 입력값으로 정규식 객체 return.
compile 함수로 반환된 정규식 객체의 메소드를 이용하여 데이터를 얻어낼 수 있음.
import re
text = "제 사무실 전화번호는 031-123-4567 입니다."
regex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
matchobj = regex.search(text)
phonenumber = matchobj.group()
print(phonenumber)
method | 설명 |
---|---|
match() | 문자열의 처음부터 정규식과 대응되는지 확인하여 match 객체 반환 |
search() | 문자열 전체를 검색하여 정규식과 매치되는지 확인하여 match 객체 반환 |
findall() | 정규식과 매치되는 모든 문자열을 리스트로 반환 |
정규식 패턴 입력값의 속성이 달라 분리하고 싶을 때 ()로 묶어 분리할 수 있음.
ex) p = re.compile('(\d+)([SDT])([*#]?)')
파라미터로 그룹 번호를 넣어 가져올 수 있고 group() 또는 group(0)으로 전체를 가져올 수 있음.
패턴 | 설명 | 예제 |
---|---|---|
^ | 이걸로 시작 | ^a => area, apple |
$ | 이걸로 끝남 | ma$ => mama, drama |
\d | 0~9 | \d\d\d => 000, 123 |
+ | +앞의 패턴이 한번 이상 있어야함 | \d+ => 숫자가 1개 이상 |
? | 앞 패턴이 없거나 하나이어야 함 (Optional 패턴을 정의할 때 사용) | [*#]? : *이나 #이 1개 있거나 없음 |
[문자들] | 문자들 중에 하나 | [SDT] |
[^문자들] | 피해야할 문자들의 집합 | [^abcde] : abcde가 아닌 문자들 |