프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
다트 게임의 점수 계산 로직을 구현하는 문제로, 문자열에 섞여 있는 점수, 보너스, 옵션을 정확히 분리하여 3번의 기회에 대한 점수를 합산해야 합니다. 정규표현식을 활용한 패턴 추출과 리스트 슬라이싱을 이용한 조건부 점수 처리가 핵심입니다.
1. 나의 풀이
정규표현식의 그룹 캡처 기능을 사용하여 데이터를 분리하고, 리스트 슬라이싱을 활용해 스타상(*)의 예외 처리를 간결하게 구현했습니다.
import re
def solution(dartResult):
# 점수(\d+), 보너스([SDT]), 옵션([*#]?)을 각각 그룹으로 묶어 추출합니다.
# 옵션 뒤의 ?는 해당 문자가 0개 또는 1개 존재함을 의미합니다.
pattern = re.compile(r"(\d+)([SDT])([*#]?)")
sdt = {"S": 1, "D": 2, "T": 3}
answers = []
# findall은 패턴과 일치하는 모든 구간을 찾아 튜플의 리스트로 반환합니다.
results = pattern.findall(dartResult)
for score, bonus, option in results:
# 현재 회차의 기본 점수를 계산하여 추가합니다.
current_score = int(score) ** sdt[bonus]
answers.append(current_score)
if option == "*":
# 스타상 처리: 마지막 1~2개의 요소에 대해 일괄적으로 2배 연산을 적용합니다.
# 슬라이싱의 안전성을 활용하여 별도의 길이 체크 없이 구현했습니다.
answers[-2:] = [x * 2 for x in answers[-2:]]
elif option == "#":
# 아차상 처리: 해당 점수를 마이너스로 만듭니다.
answers[-1] *= -1
return sum(answers)
2. 오늘 배운 점 및 복기 노트
정규표현식 선택적 수량자 ?와 그룹 추출
패턴 내부의 ([*#]?)는 스타상이나 아차상이 존재하지 않을 수도 있음을 나타내는 핵심적인 장치입니다. ? 수량자를 사용하면 옵션 문자가 없는 경우에도 전체 패턴 매칭이 실패하지 않고, 해당 그룹을 빈 문자열('')로 반환합니다. 이를 통해 루프 내부에서 인덱스 에러를 걱정하지 않고 항상 세 개의 요소를 일관되게 언패킹(score, bonus, option)하여 처리할 수 있습니다.
리스트 슬라이싱을 활용한 스타상 처리 최적화
answers[-2:] = [x * 2 for x in answers[-2:]] 코드는 파이썬 슬라이싱의 유연함을 극대화한 결과입니다. 스타상은 현재 점수와 직전 점수를 모두 2배로 만들지만, 첫 번째 회차에서 발생할 경우 직전 점수가 존재하지 않습니다. 파이썬의 슬라이싱은 지정한 범위가 리스트의 실제 크기보다 크더라도 가용한 범위 내에서만 작동하므로, 별도의 if len(answers) >= 2와 같은 조건문 없이도 안전하게 1~2개의 요소를 처리합니다.
슬라이스 할당(Slice Assignment)의 원리
answers[-2:] = [...] 형태의 문법은 리스트의 특정 범위를 새로운 내용물로 교체하는 인플레이스(In-place) 연산입니다. 원본 리스트 객체를 유지하면서 내부의 값만 효율적으로 변경할 수 있으며, 코드의 의도를 "마지막 두 항목을 업데이트한다"는 의미로 명확하게 전달합니다.
가변 숫자 데이터(10)의 정확한 처리
점수는 0점부터 10점까지 가능하므로, 단순히 \d를 사용하여 한 자리 숫자만 고려하면 10점을 1과 0으로 오인하는 심각한 논리 오류가 발생합니다. \d+를 사용해 연속된 숫자를 하나의 덩어리로 묶어 가져오고, 이를 int()로 변환하여 수치 연산에 활용하는 습관이 중요함을 배웠습니다.
'알고리즘 > 프로그래머스 문제 풀이 전략' 카테고리의 다른 글
| 정규 표현식 추가문제 - 옹알이 (2) (Python) (0) | 2026.04.27 |
|---|---|
| 정규 표현식 추가문제 - 파일명 정렬 (Python) (0) | 2026.04.27 |
| 문제 15 - 핸드폰 번호 가리기 (Python) + 특수 목적 정규식 (0) | 2026.04.27 |
| 문제14 - 문자열 다루기 기본 (Python) + 정규표현식 요약정리 (0) | 2026.04.27 |
| 문제13 - 신규 아이디 추천 (Python) (0) | 2026.04.26 |
