일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- API
- java
- applicationeventpublisher
- 문자열
- 최단경로
- brute force
- Dijkstra
- 파이썬
- 백준
- 알고리즘
- Greedy
- counting elements
- HTTP
- algorithm
- Python
- 라이브템플릿
- 소수
- spring security
- Spring
- springboot
- javascript
- 2981
- BFS
- beandefinitionstoreexception
- 2018 KAKAO BLIND RECRUITMENT
- codility
- 코딩테스트
- 프로그래머스
- error
- 탐욕법
Archives
- Today
- Total
Altiora Petamus
다트 게임 본문
🤔생각해보기
문자열 다루는 능력을 묻는 문제.
난이도는 '하' 로 분류되어 있고 실제 정답률도 73.47% 로 어려운 문제에 속하지는 않지만, 문자열을 능숙하게 처리하지 못한다면 까다로울 수 있다.
로직은 문제에 잘 설명되있으며 천천히 과정을 구현해나가면 된다. 정규식을 활용하면 간단하게 문자열에서 원하는 부분을 추출하여 사용할 수 있다.
코드
정규식 group 활용
import re
def solution(dart_result):
p = re.compile(r"(?P<point>\d+)(?P<bonus>[SDT])(?P<option>[*#]?)")
point_data = {
'S': 1,
'D': 2,
'T': 3
}
count = []
while dart_result:
result = p.search(dart_result)
point = int(result.group("point"))
bonus = result.group("bonus")
option = result.group("option")
count.append(point ** point_data[bonus])
if option == '*':
count[-1] *= 2
if len(count) > 1:
count[-2] *= 2
elif option == '#':
count[-1] *= -1
dart_result = dart_result[result.end():]
return sum(count)
문자열을 group 으로 처리하여 원하는 부분을 가져와 사용하는 방식이다. option 을 처리하는 부분은 직관적이긴 하지만, depth 가 아쉽다.
가급적이면 if-else 문은 사용하지 않는 것을 선호하는 편이고 실제로 그게 가독성에 유리하기 때문에 최대한 지양하는 것이 좋다.
pattern.findall() 사용
import re
def solution(dart_result):
p = re.compile(r"(\d+)([SDT])([*#]?)")
point_data = {
'S': 1,
'D': 2,
'T': 3,
'': 1,
'*': 2,
'#': -1
}
darts = p.findall(dart_result)
for i in range(len(darts)):
if darts[i][2] == '*' and i > 0:
darts[i - 1] *= 2
darts[i] = int(darts[i][0]) ** point_data[darts[i][1]] * point_data[darts[i][2]]
return sum(darts)
findall() 을 사용하면 튜플이 담긴 배열로 리턴받아 사용할 수 있다. 이후 담겨있는 튜플을 점수로 치환하며 과정을 진행하고 있다.
매우 많은 사람들이 이 방법으로 푼 것 같고 실제로 코드를 좀 더 심플하게 작성할 수 있다.
point_data
에 최대한 많은 정보를 미리 담아두고 필요한 때에 가져와서 사용하는 방식이다.
'1day-1algorithm' 카테고리의 다른 글
특정한 최단 경로 (0) | 2021.07.27 |
---|---|
미확인 도착지 (0) | 2021.07.17 |
추석 트래픽 (0) | 2021.07.08 |
벽 부수고 이동하기 (0) | 2021.07.05 |
문자열 다루기 기본 (0) | 2021.07.02 |