★[python_파이썬_2018 KAKAO BLIND RECRUITMENT]프로그래머스_LV1_[1차] 다트 게임_풀이

2024. 5. 25. 22:44코드리뷰

728x90
반응형

공부하는허딩크 : https://www.youtube.com/live/Io7CilXhjrk?feature=shared

 

아... 이거 풀 수 있을 것 같은데.... 쉽지 않네...

 

<첫번째 시도 : 실패>

일단 되는대로 작성해봤다.

테스트2 빼고는 모두 통과되었다. => 2자리 정수 고려 필요

중복되는 코드가 보여서 refactoring의 필요성이 눈에 보인다.

#일단 어렵게 가보자 : 자 여기서는 테스트2가 실패 : 두자리 정수인 10이 나오면 안됨.
def solution1(dartResult):
    answer = 0
    if len(dartResult) == 6:
        for i in dartResult:
            if i.isdigit():
                num = int(i)
            else:
                if i == 'S':
                    answer += num ** 1
                elif i == 'D':
                    answer += num ** 2
                else:
                    answer += num ** 3
    else:
        A = []
        for i in dartResult:
            if i.isdigit():
                A.append(int(i))
            elif i.isalpha() and i == 'S':
                A[-1] **= 1
            elif i.isalpha() and i == 'D':
                A[-1] **= 2
            elif i.isalpha() and i == 'T':
                A[-1] **= 3
            else: #특수문자 특수 동작 처리
                if i == '#':
                    A[-1] *= -1
                elif i == '*':
                    temp = len(A) - 1
                    if temp == 0:
                        A[-1] *= 2
                    else:
                        A[-1] *= 2
                        A[-2] *= 2
        answer = sum(A)          
    return answer

 

<두번째 시도 : 87.5점>

일단 방향이 보였다. 

첫번째로 str을 리스트로 분해해서 숫자, 문자, 특수문자를 분리하는 작업을 먼저 한다.

두번째로 리스트에서 불러와서 규칙에 맞게 리스트에 저장한다.

세번째로 리스트의 sum을 한다.

여기서 오류는 10같은 2개 자리 숫자의 경우 10, 0 이렇게 와서 규칙에 맞지 않을 수도 있다는 점이다.

#첫번째 코드를 조금 수정하자.  : 정수 10을 받을 수 있도록 수정 필요 => 87.5점
def solution2(dartResult):
    dart = dartResult + 'X'
    dart_list = []

    for i in range(len(dartResult)):
        for j in range(i + 1, i + 2):
            temp = dart[i] + dart[j]
            if temp.isdigit():
                dart_list.append(temp)
            else:
                if dart[i].isdigit():
                    dart_list.append(dart[i])
                else:
                    dart_list.append(dart[i])
    print(dart_list)
    A = []
    for i in dart_list:
        if i.isdigit():
            A.append(int(i))
        elif i.isalpha() and i == 'S':
            A[-1] **= 1
        elif i.isalpha() and i == 'D':
            A[-1] **= 2
        elif i.isalpha() and i == 'T':
            A[-1] **= 3
        else: #특수문자 특수 동작 처리
            if i == '#':
                A[-1] *= -1
            elif i == '*':
                temp = len(A) - 1
                if temp == 0:
                    A[-1] *= 2
                else:
                    A[-1] *= 2
                    A[-2] *= 2
    answer = sum(A)
    return answer

 

공부하는허딩크 : https://www.youtube.com/live/KJ8E8Zhh81k?feature=shared

 

 

<세번째 시도 : 맞았습니다.>

순수하게 내가 작성한 코드이다. 좀 길긴해도 뭐 어때. 이제부터 더 배우면 되지.

10같은 2개 자리 숫자를 예외처리 할 수 있도록 조정했다.

#아래 코드 정리 및 수정 : 10이 나올때 10, 0 이렇게 구분되는 오류 수정
def solution(dartResult):
    dart = dartResult + 'X'
    dart_list = []
    for i in range(len(dartResult)):
        if dart[i].isdigit() and dart[i + 1].isdigit():
            dart_list.append(dart[i] + dart[i + 1])
        elif dart[i].isdigit() and dart[i - 1].isdigit():
            continue
        else:
            dart_list.append(dart[i])
    A = []
    for i in dart_list:
        if i.isdigit():
            A.append(int(i))
        elif i.isalpha() and i == 'S':
            A[-1] **= 1
        elif i.isalpha() and i == 'D':
            A[-1] **= 2
        elif i.isalpha() and i == 'T':
            A[-1] **= 3
        else: #특수문자 특수 동작 처리
            if i == '#':
                A[-1] *= -1
            elif i == '*':
                temp = len(A) - 1
                if temp == 0:
                    A[-1] *= 2
                else:
                    A[-1] *= 2
                    A[-2] *= 2
    answer = sum(A)
    return answer    

 

<refactoring myself>

1. 문자열 분리

    - out of range발생하지 않기 위해 -1을 해서 2자리 숫자가 나올 경우 대비

    - 마지막 문자 추가

2. 규칙 정리

    - 반복되는 조건 및 필요없는 조건 삭제

#refactoring 시도
def solution(dartResult):
    A = dartResult
    #문자열 분리
    dart = []
    for i in range(len(A) - 1):
        if A[i].isdigit() and A[i + 1].isdigit():
            dart.append(A[i] + A[i + 1])
        elif A[i].isdigit() and A[i - 1].isdigit():
            continue
        else:
            dart.append(A[i])
    dart.append(A[-1])
   
    #규칙 정리
    answer = []
    for i in dart:
        if i.isdigit():
            answer.append(int(i))
        elif i == 'S':
            answer[-1] **= 1
        elif i == 'D':
            answer[-1] **= 2
        elif i == 'T':
            answer[-1] **= 3
        elif i == '#':
            answer[-1] *= -1
        else:
            if len(answer) == 1:
                answer[-1] *= 2
            else:
                answer[-1] *= 2
                answer[-2] *= 2      
    return sum(answer)  

 

 

<다른 사람 풀이 참고>

#코드가 깔끔하고 가독성이 좋다.

1. 문자열은 replace로 교체 (#remove나 pop대신) => 그리고 리스트로 전환

2. dict로 알파벳 규칙을 key, value로 할당

3. 조건을 코드로 작성

#다른 사람 풀이 참고
def solution(dartResult):
    #문자열 리스트 전환
    A = dartResult.replace('10', 'k')
    dart = ['10' if i == 'k' else i for i in A]
   
    answer = []
    rule = {'S' : 1, 'D' : 2, 'T' : 3}
    for i in dart:
        if i in rule:
            answer[-1] **= rule[i]
        elif i == '#':
            answer[-1] *= -1
        elif i == '*':
            answer[-1] *= 2
            if len(answer) != 1:
                answer[-2] *= 2
        else:
            answer.append(int(i))
    return sum(answer)  

 

#코드가 기발하네.

내가 엄청 고민했던 2자리 정수 10을 이렇게 깔끔하게 넘어갈 수 있다니....

그리고 answer[-2:] = [x * 2 for x in answer[-2:]] 이 부분도 answer가 1개 일때와 2개 일때 3개 일때 한줄로 표현이 가능하다.

def solution(dartResult):
    answer = []
    dart = {'S' : 1, 'D' : 2, 'T' : 3}
    n = 0
   
    for i, j in enumerate(dartResult):
        if j in dart:
            answer.append(int(dartResult[n:i]) ** dart[j])
        if j == '#':
            answer[-1] *= -1
        if j == '*':
            answer[-2:] = [x * 2 for x in answer[-2:]]
        if not j.isdigit():
            n = i + 1
           
    return sum(answer)

 

※ 위의 조건에서 elif로는 에러가 나는데 그 부분이 아직 이해가 가질 않는다.

728x90
반응형