[Programmers][Py] 다트 게임

mj·2024년 8월 23일
0

코딩테스트문제

목록 보기
45/50

✅ 문제

문제 바로가기


✅ 나의 풀이

  • 전처리 : dartResult10@로 변환 (후에 다시 @10으로 변환)
    (전처리 없이 for문을 돌리면 '10'을 '1'과 '0'으로 따로따로 인식한다.)
  • dartResult의 문자를 하나씩 탐색하며 결과값을 계산한다.
  • 3번의 다트게임 결과는 리스트 result에 순서대로 저장한다.
  • 리턴값 : result의 합
def solution(dartResult):
    result = []
    idx = -1
    bonus = {"S":1, "D":2, "T":3}
    
    dartResult = dartResult.replace("10", "@")
    
    for dart in dartResult:
        if dart == "@":
            dart = '10'
            
        if dart.isdigit():
            idx += 1
            result.append(int(dart))
        elif dart in bonus:
            result[idx] = result[idx] ** bonus[dart]
        elif dart == '*':
            result[idx] *= 2
            if idx != 0: result[idx - 1] *= 2
        elif dart == '#':
            result[idx] *= -1
    
    return sum(result) 

✅ 다른 풀이

다른 풀이 1

new_list = ['10' if i == '@' else i for i in dartResult]

@을 다시10으로 변환시키는 과정.
(나의 경우, for문을 최소한으로 사용하기 위해 dartResult의 문자를 하나씩 탐색하는 for문에서 함께 처리함.)


다른 풀이 2

# BEFORE
if dart.isdigit():
# AFTER
else:
	answer.append(int(j))
    i += 1

dartResult는 무조건 0~10사이의 정수, S, D, T, #, *로 이루어져 있다.
따라서 정수인 경우를 처리하고싶다면 isdigit()할 필요없이 else로도 처리 가능하다.


다른 풀이 3

if d == "*":
	scores[-2:] = [x*2 for x in scores[-2:]]

해당 점수와 이전 점수를 2배로 만드는 코드이다.
인덱싱과 리스트 컴프리헨션을 사용하여 간단하게 표현가능하다.



✅ 실수했던 부분

테스트 4, 5, 6, 7에서 런타임 에러남.

def solution(dartResult):
    result = [0,0,0]
    idx = -1
    bonus = {"S":1, "D":2, "T":3}
    
    # 1. 전처리 (입력을 리스트로 분리하기)
    if "10" in dartResult:
        a, b = map(list, dartResult.split("10"))
        dartResult = a + ['10'] + b
    else:
        dartResult = list(dartResult)

    # 2. 
    for dart in dartResult:
        if dart.isdigit():
            idx += 1
            result[idx] = int(dart)
        elif dart in bonus:
            result[idx] = result[idx] ** bonus[dart]
        elif dart == '*':
            result[idx] *= 2
            if idx != 0: result[idx - 1] *= 2
        elif dart == '#':
            result[idx] *= -1
    
    return sum(result)

에러 원인
위의 코드는 10을 한번만 처리해주므로 10이 한번만 포함된 경우만 가능하다.
예를들어 1D2S#10S는 문제없이 통과되지만 10D10S10S와 같은 10이 2번 이상 포함된 경우에는 실패한다.

에러 해결
10이 여러개있어도 처리해줄 수 있도록 바꿔야 한다.

profile
일단 할 수 있는걸 하자.

0개의 댓글