Altiora Petamus

다트 게임 본문

1day-1algorithm

다트 게임

Haril Song 2021. 7. 17. 00:30
 

코딩테스트 연습 - [1차] 다트 게임

 

programmers.co.kr

🤔생각해보기

문자열 다루는 능력을 묻는 문제.

난이도는 '하' 로 분류되어 있고 실제 정답률도 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