jeeyeonLIM / coding_test

Let's practice the coding test!
1 stars 0 forks source link

[2018 KAKAO BLIND RECRUITMENT [1차]] 다트 게임 #78

Open jeeyeonLIM opened 3 years ago

jeeyeonLIM commented 3 years ago

다트 게임

image

jeeyeonLIM commented 3 years ago

나의 코드

import re

def solution(dartResult):

### 정규식 활용해서 원하는list로 만들어주기
p = re.compile("(\d+)([a-zA-Z])(\*|#)?") 
scores = p.findall(dartResult)
#print(scores)
# [('1', 'S', ''), ('2', 'D', '*'), ('3', 'T', '')]

### 옵션에 해당하는 index 저장 
 # *는 해당 점수와 이전 점수를 2배로 만들고
 # #은 해당 점수는 -가 된다.
star=[0]*3
sharp=[0]*3
for i,score in enumerate(scores):
    if score[2] == "*": 
        if i==0 : # 첫번째 index일 경우 해당값만 해당함.
            star[i]+=1
        else :  # 그외의 경우 해당값과 이전 index값이 해당.
            star[i]+=1
            star[i-1] +=1

    elif score[2] == "#":
        sharp[i] -= 1

### sharp 변환해주기
 # sharp는 바로 전체 값에 곱해주려고 처리해주자. 처리 결과 아래와 같음.
    # 1일 경우 x(+1)
    # -1일 경우 x(-1)
    # -2일 경우 x(-2)
for i in range(3):
    if sharp[i] ==0:
        sharp[i]=1

### 영역별 제곱수가 다르기 때문에 hash map 활용해 값을 지정해놓고
power_map = {'S':1, 'D':2, 'T':3}

### 이제 본격 계산 시작
answer=0
for i, score in enumerate(scores):
    answer += (  (int(score[0])**(power_map[score[1]])) * (2**(star[i])) * sharp[i] )
    ## 파이썬에서는 ^이 제곱승이 아니고 **사용해야 함.... 
return answer 
jeeyeonLIM commented 3 years ago

정규식 설명

jeeyeonLIM commented 3 years ago

다른 사람들의 풀이 ver1.

def solution(dartResult): bonus = {'S' : 1, 'D' : 2, 'T' : 3} option = {'' : 1, '' : 2, # 2배가 됨. '#' : -1} # -1(즉 해당 숫자가 -가 됨) p = re.compile('(\d+)([SDT])([#]?)') dart = p.findall(dartResult) print(dart)

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]]

print(dart)

answer = sum(dart)
return answer

### 다른 사람들의 풀이 ver2. 
- 정규식 사용 X
```python
def solution(dartResult):
    point = []
    answer = []
    dartResult = dartResult.replace('10','k')
    point = ['10' if i == 'k' else i for i in dartResult]
    print(point)

    i = -1
    sdt = ['S', 'D', 'T']
    for j in point:
        ### 문자열 처리
        if j in sdt :
            answer[i] = answer[i] ** (sdt.index(j)+1)
        elif j == '*':
            answer[i] = answer[i] * 2
            if i != 0 :
                answer[i - 1] = answer[i - 1] * 2
        elif j == '#':
            answer[i] = answer[i] * (-1)

        ### 숫자라고 하면 append 해주기 
        ### 숫자가 들어올 때마다 i+1 됨
        else:
            answer.append(int(j))
            i += 1 

    return sum(answer)