kiteday 님의 블로그

[프로그래머스-파이썬] 다트게임 (feat. re 정규식 사용법) 본문

코딩테스트

[프로그래머스-파이썬] 다트게임 (feat. re 정규식 사용법)

kiteday 2025. 12. 11. 15:30
반응형
SMALL

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

 

파이썬 정규식 re를 사용하는 방법이 이 문제 풀이의 킥이다.

함수 목적 설명
re.match() 문자열 시작부터 검색 문자 처음부터 정규식과 일치하는 지 확인
re.search() 문자열 전체 검색 문자열 전체를 검색하여 정규식과 가장 먼저 일치하는 패턴을 찾음. 일치하면 'Match Object' 반환
re.findall() 모든 일치패턴 검색 정규식과 일치하는 패턴을 찾아 리스트로 반환
re.sub() 패턴 치환 정규식과 일치하는 패턴을 문자열로 변환하여 리스트 반환

 

문자 설명 예시
. 모든 한 문자와 일치 (줄바꿈 \n 제외) a.b → acb, a1b
^ 문자열의 시작
^Hello → Hello World는 일치, Say Hello는 불일치
$ 문자열의 끝
World$ → Hello World는 일치, World!는 불일치
* 0회 이상 반복
a*b → b, ab, aaab
+ 1회 이상 반복
a+b → ab, aaab (단, b는 불일치)
? 0회 또는 1회 반복 a?b → b, ab
{n} 정확히 n회 반복 a{3}b → aaab
{n,m} n회 이상 m회 이하 반복
a{2,4}b → aab, aaab, aaaab
` ` OR (선택)
() 그룹화
패턴의 일부를 묶거나 추출할 때 사용
[] 문자 세트 (괄호 안의 문자 중 하나)
[abc] → a, b, c 중 하나

 

 

클래스 설명 예시
\d 모든 숫자 ([0-9])  
\D 숫자가 아닌 문자  
\w
단어 문자 (알파벳, 숫자, 언더스코어 _)
 
\W
단어 문자가 아닌 문자
 
\s
공백 문자 (스페이스, 탭, 줄바꿈)
 
\S
공백 문자가 아닌 문자
 

 

이런 정규식 규칙에 따라서 식을 완성했다.

 

import re

def solution(dartResult):
    answer = 0
    
    pattern = r"(10|[0-9])([SDT])([*#]?)"
    results = re.findall(pattern, dartResult)
    # print(results)
    
    scores = []
    for i, dart in enumerate(results):
        score = int(dart[0])
        
        if dart[1] == 'D':
            score = score**2
        elif dart[1] == 'T':
            score = score**3
        
        if dart[2]:
            if dart[2] == '*':
                if i > 0:
                    scores[i-1] *= 2
                score *= 2                    
            elif dart[2] == '#':
                score = -score
        scores.append(score)
        
    # print(scores)
    return sum(scores)

 

pattern에서 "10|[0-9]"인 부분은 정확히 0부터 10을 의미하지만 더 넓은 포괄적 의미로 "\d+"나 "\d{1,2}"로 해도 괜찮다.

LIST