CodingTest/Programmers

[ 프로그래머스 ] [1차] 다트게임

EEOOOO 2022. 7. 1. 19:20

/  제출 1  /

 

def solution(dartResult):
    darts = list(dartResult.strip())
    result = []
    num = 'ss'
    for dart in darts:
        print(num, dart, result)
        # 숫자 저장
        if dart.isdigit():
            if num == 1 and dart == '0':
                print('10')
                num = 10
            if num != 'ss':
                result.append(num)
                print(result)
                num = -1
            
            num = int(dart)
            
        # S,D,T에 따라 곱해주기
        elif dart == 'S':
            num = num ** 1
        elif dart == 'D':
            num = num ** 2
        elif dart == 'T':
            num = num ** 3
            
        # * 나 #일 때 
        elif dart == '*':
            num = num * 2
            if result:
                result[-1] = result[-1] * 2
        elif dart == '#':
            num = num * (-1)
    result.append(num)
    return sum(result)
채점 결과
정확성: 87.5
합계: 87.5 / 100.0

풀이 소요 시간 21분

 

하.. 요고 안되네..

 

단순한 구현이라고 생각해서 한 번에 통과될 줄 알았는데.. 이래서는 히든테케 있을 때 장담할 수 없습니다..

 

더 정확하게 따져봅시다..

 

아직 테스트케이스 추가해 검증 단계를 하지 않은 상태입니다. 수정해나가 봅시다.

 

[ 오류 발견 ]

 

10 뒤에 S/D/T 와 */#가 있는 경우를 수행을 안 해주고 10이 완성되자마자 바로 넣어버립니다.

전체 작동 방식을 손봐줘야할 것 같아보입니다.

이래서 설계단계부터 예외 사항을 포함해서 확실하게 구성했어야하는 것 같습니다. 통째로 조정해야할 수 있으니 말입니다.

 


def solution(dartResult):
    result = []
    num = ''
    for dart in dartResult:
        # 숫자 저장
        if dart.isdigit():
            num += dart
            
        # S,D,T에 따라 곱해주기
        elif dart == 'S':
            num = int(num) ** 1
            result.append(num)
            num = ''
        elif dart == 'D':
            num = int(num) ** 2
            result.append(num)
            num = ''
        elif dart == 'T':
            num = int(num) ** 3
            result.append(num)
            num = ''
            
        # * 나 #일 때 
        elif dart == '*':
            result[-1] = result[-1]*2
            if len(result) > 1:
                result[-2] = result[-2] * 2
        elif dart == '#':
            result[-1] = result[-1] * (-1)
            print(num)
        
           
        
    return sum(result)
채점 결과
정확성: 100.0
합계: 100.0 / 100.0
 

아예 갈아엎은 정도의 코드입니다.

 

이 문제에서 접근 실패 요인은 각 변수들에 대한 자료형을 섞어서 사용하면서 스스로 헷갈린 것입니다.

각 요소에 대해 정확하게 파악하도록 해야겠습니다.

 

그리고 중복되는 코드에 대해서 되게 기피하느라 유용한 알고리즘을 짜기 위해 깊게 들어가는 성향이 있는 것 같습니다. 좋기는 한데 일단 목적이 코딩테스트 점수 통과라면, 사실 이 이유가 아니라 정확성에 근거했을 때, 정확성 위에 효율성 있으니 정확성 잡고 그 다음에 효율적이게 고치는 편이 나아보입니다. 그 반대로 하려다가 지금 정답 못 내는 상태로 바뀐 것 같습니다.

 

문제의 난이도에 비해서 여러모로 심란해진 문제였습니다.


/  다른 분 풀이  /

 

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

 

 

하.. 10 을 변환하는걸로 머리 싸맸는데 이렇게 표현하다니.. 진짜 .. ㅠㅜ 그리고 S, D, T 관련해 계산하신 것도 진짜 간단하고 너무 스마트.. 

너무 부럽다 이렇게 코드 짤 수 있다니..