programmers Level1 (8)

Backend, DataEngineer·2021년 12월 2일
0
post-thumbnail

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

최고 답안 1

def solution(dartResult):
    stack = []
    dartResult = dartResult.replace("10", "A")
    bonus = {'S': 1, 'D': 2, 'T': 3}
    
    for i in dartResult:
        if i.isdigit() or i=='A':
            stack.append(10 if i == 'A' else int(i))
        elif i in ('S', 'D', 'T'):
            num = stack.pop()
            stack.append(num ** bonus[i])
        elif i == '#':
            stack[-1] *= -1
        elif i == '*':
            num = stack.pop()
            if len(stack):
                stack[-1] *= 2
            stack.append(2 * num)
    return sum(stack)

최고 답안 2

def solution(dartResult):
    dartResult = dartResult.replace('10', 'k')
    ing = []

    for i in dartResult:
        ing.append(i)

    for i in range(len(ing)):
        if ing[i] == "k":
            ing[i] = "10"

    for i in range(len(ing)):        
        try:
            ing[i] = int(ing[i])
        except ValueError:
            pass
    if type(ing[1]) == str and type(ing[2]) == int:
        ing.insert(2, "@")
    if type(ing[4]) == str and type(ing[5]) == int:
        ing.insert(5, "@")
    if len(ing) == 8:
        ing.append("@")

    for i in range(len(ing)):
        if ing[i] == "S":
            ing[i] = 1
        if ing[i] == "D":
            ing[i] = 2
        if ing[i] == "T":
            ing[i] = 3

    score = []

    for i in range(3):
        score.append(ing[i*3]**ing[i*3+1])

    if ing[2] == "*":
        score[0] *= 2
    elif ing[2] =="#":
        score[0] *= -1

    if ing[5] == "*":
        score[0] *= 2
        score[1] *= 2
    elif ing[5] =="#":
        score[1] *= -1

    if ing[8] == "*":
        score[1] *= 2
        score[2] *= 2
    elif ing[8] =="#":
        score[2] *= -1

    return sum(score)
    

느낀점:
부끄럽지만 나는 이문제를 풀지 못했다 re.finditer로 S,D,T의 인덱스를 저장한후 앞의 숫자와 뒤의 연산자를 구해 답을 이끌어 내려 했으나 연산자의 유무에따라서, 또한 S,D,T의 유무에 따라서 모든것을 경우에 맞게 코딩하는것은 너무나 비효율적이여서 포기하고 말았다. 결국 베스트 답안을 보았는데 이 문제를 보고 stack을 떠올렸고, 그대로 코드에 적용했다고 한다. 특히 10이라는 숫자가 string에 있을때 한 문자로 인식하기 위해 replace를 적용한건 정말 천재적이라고 생각한다. 가장 까다로웠던 '*'문제도 pop 함수를 사용한것을 보고 이문제가 stack을 활용하여 푸는 것을 의도했구나라는 생각이 들었다. 최고 답안2는 도중에 내가 포기했던것을 부끄럽게 만들었고, 서투른 코드지만 생각이 깊구나 라는 생각을 들게 했던 코드라서 포스팅에 남겨 보았다. 최고답안1에비하면 코드가 굉장히 길고 디버깅을 해보면 수행과정 또한 3배 이상 길다. 조건문 도 굉장히 많고, 하지만 코드를 한줄한줄 실행해보면 코딩 실력이 미숙하더라도 답으로 가는 길을 정확이 알고 있음이 보였다. 나는 앞서 말했다 싶이 연산자의 유무, S,D,T의 유무에 따라 조건이 굉장히 많아져 포기했었다. 하지만 이 사람은 연산자가 없으면 비어버리는 공간에 '@'라는 문자를 삽입하여 공간을 채워 버렸다. 즉, 인덱스의 변동을 지워버린 것이다. 이 코드를 처음 봤을 때 황당하기도 했지만 이 코드를 통해 많은 것을 배웠다. 이러한 방식을 생각해낸것도 굉장한 코딩의 재능이 아닌 가 싶다. 이번 문제를 풀면서 부끄럽기도 했고 문제가 주어졌을 때 새로운 눈으로 바라 보는 방법을 배웠다.

profile
오늘 더 좋은 사람, 더 좋은 하루

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN