코딩테스트 문제

[프로그래머스/Python] 다트 게임

왕초보코딩러 2024. 4. 16. 14:22
728x90

문제

https://school.programmers.co.kr/learn/courses/30/lessons/17682

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


정규식을 사용하자!

2024.04.15 - [Python] - 정규식(regular expression)

 

정규식(regular expression)

re모듈을 통해 사용 import re 문자열에 대한 연산에 사용. 문자열 패턴 표현, 문자열 수정, 분할 많이 쓰는 패턴 패턴 설명 ^패턴 이 패턴으로 시작해야 함 패턴$ 이 패턴으로 끝나야 함 패턴1|패턴2

dogfoot1.tistory.com

 

정규식을 사용하여 게임 3세트를 나누기

data = '1S2D*3T'

# 리스트 형식으로 리턴
re.findall(r'([\d]{1,2})([SDT])([*#])?', data)
[('1', 'S', ''), ('2', 'D', '*'), ('3', 'T', '')]

 

정규식 살펴보기

([\d]{1,2})(\w)([*#])?

 

괄호로 그룹화 한 것을 기준으로 살펴보겠습니다.

1번 그룹 [\d]{1,2} -> 한 자리 혹은 두 자리 숫자(0~10 사이)

2번 그룹 [SDT] -> S, D, T 중 하나

3번 그룹 [*#]? -> *, # 중 하나 없어도 됨(? 때문에)

 

 

1.  조건문으로

import re
def solution(dartResult):
    d_list = re.findall(r'([\d]{1,2})([SDT])([*#])?', dartResult)
    add = []
    for d in d_list:
        if d[1] == 'S':
            add.append(int(d[0])**1)
        elif d[1] == 'D':
            add.append(int(d[0])**2)
        else:	# 'T'면
            add.append(int(d[0])**3)

        if d[2] =='#':
            add[-1] = -add[-1]
        elif d[2] == '*':
            if len(add) != 1:
                add[-2] = add[-2]*2
                add[-1] = add[-1]*2
            # 앞에 값이 없을 때
            else:
                add[-1] = add[-1]*2
    return sum(add)

 

 

 

2. 더 쉽게 딕셔너리로

import re
def solution(dartResult):
    st = {'S':1, 'D':2, 'T':3}
    d_list = re.findall(r'([\d]{1,2})([SDT])([*#])?', dartResult)
    add = []
    for d in d_list:
        add.append(int(d[0])**st[d[1]])

        if d[2] =='#':
            add[-1] = -add[-1]
        elif d[2] == '*':
            if len(add) != 1:
                add[-2] = add[-2]*2
                add[-1] = add[-1]*2
            else:
                add[-1] = add[-1]*2
    return sum(add)

딕셔너리를 이용하면 코드가 간단해진다.