새소식

Computer Science/코딩테스트 문제 풀이

[N시간만에 끝내는 Python 코딩테스트] 3편 2018 카카오 코딩테스트 2번 다트게임 (with 정규표현)

  • -

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

 

프로그래머스

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

programmers.co.kr

 

https://www.youtube.com/watch?v=vn88ltwL9ZU

 

간단한 구현 문제인데, import re, 정규표현식을 알게 되었다. 

 

방법 1 

def solution(dartResult):
    answer = []
    for i, info in enumerate(dartResult, 1): # 시작 i를 1부터 세기 
        if info == 'S':
            answer[-1] **= 1
        elif info == 'D':
            answer[-1] **= 2
        elif info == 'T':
            answer[-1] **= 3
        elif info == '*':
            answer[-1] *= 2
            if len(answer) >= 2:
                answer[-2] *= 2
        elif info == '#':
            answer[-1] *= -1
        else:
            if dartResult[i-1:i+1] == '10':
                answer.append(10)
            elif dartResult[i-2:i] != '10':
                answer.append(int(info))
            # else:
            #     answer.append(int(info))
                

    return sum(answer)
                

arr = '1D2S3T*'
solution(arr)

 

방법 2

import re 

testcase = ['1S2D*3T', '1D2S#10S']
pattern = re.compile(r'([0-9]|10)([SDT])([\*\#]?)')

print(pattern.findall(testcase[0]))
print(pattern.findall(testcase[1]))

>>> 

[('1', 'S', ''), ('2', 'D', '*'), ('3', 'T', '')]

[('1', 'D', ''), ('2', 'S', '#'), ('10', 'S', '')]

 

이렇게 나오는 것을 알았으니 최종 코드에 적용해보면 

import re 

def solution(dartResult):
    pattern = re.compile(r'([0-9]|10)([SDT])([\*\#]?)')
    answer = []
    calMap = {
        'S': lambda x: x,
        'D': lambda x: x**2,
        'T': lambda x: x**3
    }
    
    for num, bon, op in pattern.findall(dartResult):
        val = calMap[bon](int(num))     # 딕셔너리에 함수를 넣어 (int(num))으로 입력 받는다 
        if op == '*':
            val *= 2
            if answer:              # 이미 계산된 숫자가 있으면 
                answer[-1] *= 2     # 얻은 점수도 *2를 해준다 
        elif op == '#':
            val *= -1
        
        answer.append(val)
    
    return sum(answer)


arr = '1D2S3T*'
solution(arr)

 

딕셔너리에 함수를 넣는것 (lambda) 와 

import re 정규 표현식을 알게 되었다

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.