39. 다트확률 구하기

2020. 9. 12. 23:46·알고리즘_코딩테스트/프로그래머스_Level1

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. 키패드 누르기  (1) 2020.09.12
38. 실패율  (1) 2020.09.12
37. 비밀지도 찾기  (0) 2020.09.12
36. 예산  (0) 2020.09.12
35. 별 찍기  (0) 2020.09.12
'알고리즘_코딩테스트/프로그래머스_Level1' 카테고리의 다른 글
  • 40. 키패드 누르기
  • 38. 실패율
  • 37. 비밀지도 찾기
  • 36. 예산
논곰
논곰
현재 2년 유목하고, 3년 이상 리테일 쪽에서 머신러닝 엔지니어로 잠시 정착 중인 AI 엔지니어입니다.
  • 논곰
    에이아이 유목민
    논곰
  • 전체
    오늘
    어제
    • 분류 전체보기 (200)
      • 기술 견문록 (22)
        • MLOps (8)
        • ProductServing (5)
        • 협업 툴 (3)
        • Error Collecting (2)
        • 컨퍼런스 (1)
        • 자격증 (1)
      • IT 견문록 (10)
        • 추가 학습 정리 (10)
      • 알고리즘_코딩테스트 (162)
        • 프로그래머스_Level1 (40)
        • 백준코딩테스트_단계별문제풀이 (14)
        • 이것이 코딩테스트다 (63)
        • 2021_알고리즘 스터디 (30일) (28)
        • 주간코딩 스터디 (주코스) (17)
      • 독서 견문록 (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    MLFlow
    다시보기
    단계별문제풀이
    주간회고
    그래프이론
    백준
    정렬
    ODQA
    부스트캠프_AITech3기
    알고리즘스터디
    글또
    U_stage
    파이썬 3
    프로그래머스
    백트랙킹
    dp
    python3
    알고리즘_스터디
    기술면접
    mrc
    dfs
    부스트캠프_AITech_3기
    그리디
    Level2
    구현
    이코테
    Level2_PStage
    Level1
    이진탐색
    최단경로
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
논곰
39. 다트확률 구하기
상단으로

티스토리툴바