국문과 유목민

39. 다트확률 구하기 본문

알고리즘_코딩테스트/프로그래머스_Level1

39. 다트확률 구하기

논곰 2020. 9. 12. 23:46

0. 문제

링크) https://programmers.co.kr/learn/courses/30/lessons/17682

 

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

 

programmers.co.kr


1. 알고리즘 계획

※ 일부 알고리즘을 검색함 

- 초기에 방향성을 잡지 못해서, '정규식'에 대한 키워드를 검색했다.

  1. 정규식을 이용해 문자열을 슬라이싱한다.
  2. 각 부분에 해당하는 부분들을 if문으로 나눠 구분한다.
  3. 자주 사용되는 부분은 다른 함수로 빼서 코드를 단축시킨다.
  4. #이나 *의 기호의 경우 특수한 경우로서 한 번 더 생각해줘야 한다.

 


2. 나의 코드

import re
def solution(dartResult):
    # 정규식 이용
    p = re.compile('\d+\D[*#]?')
    ls = p.findall(dartResult)
    answer = []
    for i in ls:
        if i[-1] in ['S', 'D', 'T']:
            answer.append(change(i))
        elif i[-1] == "*":
            answer.append(change(i[:-1]))
            answer[-1] *= 2
            answer[-2:-1] *= 2
        elif i[-1] == "#":
            answer.append(change(i[:-1]))
            answer[-1] *= (-1)
    return sum(answer)

def change(i):
    if i[-1] == 'S':
        return int(i[:-1])**1
    elif i[-1] == 'D':
        return int(i[:-1])**2
    elif i[-1] == 'T':
        return int(i[:-1])**3

- 개인적으로 마음에 들지않은 코드라고 생각한다. 

- 물론 처음에 생각했던 switch-case문보다 낫다고는 하지만,

- 새로 만든 함수를 3번이나 식에 넣었어야 하기 때문에 아쉽다고 생각한다.


3. 다른 사람의 코드

def solution2(dartResult):
    bonus = {'S' : 1, 'D' : 2, 'T' : 3}  # switch문 대신 dict형을 사용 / dict형 사용법에 대한 이해 필요
    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]]
    return sum(dart)

- 우선 딱 봐도 코드의 길이가 짧다.

- 우선 문자들에 해당하는 값을 '딕셔너리'형으로 만들었다는 점에서 참신하다고 생각했다.

- 정규식을 괄호로 묶으면 각각이 리스트가 된다는 점도 처음 알았다. (★)


4. 정리 및 리뷰

- 간소화된 코드들을 보면 대체적으로 '리스트'형만을 사용하는 것이 아니라 '딕셔너리'형도 자주 나오는 것을 확인할 수 있었다.

- '정규형'에 대해서는 이전에 배우긴 했었지만 제대로 쓰지는 못헀던 것 같다. 정규형 형식에 대해서 알아두는 것도 굉장히 좋을 것 같다. 이에 대해서 시간을 내서 암기를 해야겠다.


코드 만족도: ★★

'알고리즘_코딩테스트 > 프로그래머스_Level1' 카테고리의 다른 글

40. 키패드 누르기  (0) 2020.09.12
38. 실패율  (0) 2020.09.12
37. 비밀지도 찾기  (0) 2020.09.12
36. 예산  (0) 2020.09.12
35. 별 찍기  (0) 2020.09.12
Comments