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

문제 출처

https://programmers.co.kr/learn/courses/30/lessons/17682?language=python3 

 

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

 

programmers.co.kr

 

이 문제는 문자열 처리를 통해 합을 구해야한다. 이때 스타상(*) 조건에 의해 이전값을 기억해야 하므로 합을 저장하는 변수를 배열로 잡는다.

 

주어진 문자열에서 다트 점수가 10일 경우 문자가 '1'과 '0'으로 나눠져서 받아지기 때문에 그부분에 대한 처리를 처음에 해주었다. 이때 cur을 초기화 하지않으면 런타임 에러가 발생한다.

 

예를 들어 점수가 0S로 들어오게 된다면 if문에서 cur 값에 값이 할당되지 않기 때문에 런타임에러가 발생한다.

 

이부분만 조심하면 쉽게 풀 수 있었다.

 

내 코드

def solution(dartResult):
    answer = []
    score = {'S': 1, 'D': 2, 'T': 3}
    
    cur = -1
    idx = -1
    for i in dartResult:
            
        if i in ['S', 'D', 'T']:
            answer[idx] = answer[idx] ** score[i]
        elif i == '*':
            answer[idx] *= 2
            if idx != 0:
                answer[idx-1] *= 2
        elif i == '#':
                answer[idx] *= -1
        else:
            if int(i) == 0 and cur == 1:
                cur = 10
                answer.pop()
                answer.append(cur)                
            else:
                cur = int(i)
                answer.append(cur)
                idx += 1
    return sum(answer)

 

다른 사람이 푼 풀이

import re

def solution(dartResult):
    bonus = {'S' : 1, 'D' : 2, 'T' : 3}
    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]]

    answer = sum(dart)
    return answer

다음과 같이 정규표현식으로 간단하게 풀어낼 수 있다.

 

 

정규 표현식 https://wikidocs.net/4308

  • re.compile을 사용하여 컴파일된 패턴 객체로, 그 이후의 작업을 수행한다.
  • 컴파일된 패턴 객체를 사용하여 문자열 검색을 수행한다. 다음과 같은 4가지 메서드를 제공한다.
 Method 목적
match() 문자열의 처음부터 정규식과 매치되는지 조사한다.
search() 문자열 전체를 검색하여 정규식과 매치되는지 조사한다.
findall() 정규식과 매치되는 모든 문자열(substring)을 리스트로 돌려준다.
finditer() 정규식과 매치되는 모든 문자열을 반복 가능한 객체로 돌려준다.

 

ex)

import re

p = re.compile('[a-z]+')
result = p.findall("life is too short")
print(result)

👉 result

['life', 'is', 'too', 'short']
#  "life is too short" 문자열의 'life', 'is', 'too', 'short' 단어를 각각 [a-z]+ 정규식과 매치해서 리스트로 돌려준다.

※ 기본 패턴

  - [abcd]: a or b or c or d

  - [0-9]: 모든 숫자

  - [a-z]: 모든 소문자

  - [A-Z]: 모든 대문자

  - [a-zA-Z0-9]: 모든 알파벳 문자 및 숫자

  - [^0-9]: ^가 맨 앞에 사용 되는 경우 해당 문자 패턴이 아닌 것과 매칭

  - \d: [0-9]와 동일

  - \D: 숫자가 아닌 문자 [^0-9]와 동일

  - \s: 공백 문자(띄어쓰기, 탭, 엔터 등)

  - \S: 공백이 아닌 문자

  - \w: 알파벳대소문자, 숫자 [0-9a-zA-Z]와 동일

  - '+': 1번 이상의 패턴이 발생

  - '*': 0번 이상의 패턴이 발생

  - '?': 0 혹은 1번의 패턴이 발생

 

댓글

Designed by JB FACTORY