카테고리 없음

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

seonyounggg 2021. 4. 18. 15:28

✏️ 문제

 

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

 

programmers.co.kr

✏️ 풀이

조건 그대로 구현하는 문제이다.

배열 인덱싱만 주의하면 크게 어려울 것은 없지만 조건이 구구절절 써있다보니 처음엔 다소 이해하기가 어려웠다.

문자열을 3개씩 자르고 만약 옵션이 없는 경우 / 숫자가 10인 경우를 각각 예외처리 해주었다.

 

✏️ 코드

def solution(dartResult):
    total = []
    cur = 0
    while True:
        if cur == len(dartResult):
            break
        cmd = dartResult[cur:cur + 3]
        if cmd[0]=='1' and cmd[1]=='0':
            cmd = dartResult[cur:cur+4]
            if cmd[3:] != '*' and cmd[3:] != '#':  # 옵션 없음
                cmd = dartResult[cur:cur + 3]
                cur = cur + 3
            else:
                cur = cur + 4
            score = 10
            bonus = cmd[2]
            option = cmd[3:]
        else:
            if cmd[2:] != '*' and cmd[2:] != '#':  # 옵션 없음
                cmd = dartResult[cur:cur + 2]
                cur = cur + 2
            else:
                cur = cur + 3
            score = int(cmd[0])
            bonus = cmd[1]
            option = cmd[2:]

        if bonus == "S":
            i = score ** 1
        elif bonus == "D":
            i = score ** 2
        elif bonus == "T":
            i = score ** 3

        if option == '*':
            if total:
                total.append(2 * total.pop())
            total.append(i * 2)
        elif option == '#':
            total.append(i * (-1))
        else:
            total.append(i)

    answer = sum(total)
    return answer

너무 지저분하지만... 문제 조건 자체가 헷갈려서 정리도 쉽지 않았다.

10일 경우에는  flag변수를 하나 둬서 인덱스에 1씩 더하는 방법으로 코드 중복을 줄일 수 있을 것 같다. 나중에 해야지....

 

✏️ 다른 사람 풀이

def solution(dartResult):
    point = []
    answer = []
    dartResult = dartResult.replace('10','k')
    point = ['10' if i == 'k' else i for i in dartResult]

    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)
        else:
            answer.append(int(j))
            i += 1
    return sum(answer)

10을 애초에 다른 문자로 바꿔두는 방식으로 예외 처리를 한 풀이이다.

깔끔...

 

✏️ 생각

201 카카오 블라인드 공채 문제...

Level 1 이라 구현 자체는 쉬운데 문제 조건 생긴게 복잡하다.

그나마 위에 처럼 10만 잘 처리해주면 수월할 듯 하다!