zygygy@home:~$

카카오 신입 공채 코딩 테스트: 다트 게임

국내 회사들도 개발자 채용을 위해 코딩 테스트를 적극 도입하고 있다. 얼마전 화제가 되었던 카카오 신입 공채 코딩 테스트 문제 중에서 하나를 풀어보자.

문제

카카오 신입 공채 1차 코딩 테스트 - ‘다트 게임’ 점수 계산

http://tech.kakao.com/2017/09/27/kakao-blind-recruitment-round-1

풀이

import re

def char_to_power(ch):
    if ch == 'S':
        return 1
    elif ch == 'D':
        return 2
    elif ch == 'T':
        return 3
    assert False

def str_to_iter_tuples(score_str):
    regex_pattern = r"(\d+)([DST])(#|\*)?"
    conv = lambda groups: (int(groups[0]), char_to_power(groups[1]), groups[2])
    return (conv(m.groups()) for m in re.finditer(regex_pattern, score_str))

def tuples_to_score(iter_tps):
    prev_pt = 0
    total_score = 0
    for pt, pw, opt in iter_tps:
        point = pt ** pw
        if opt == '#':
            point *= -1
            prev_pt = point
            total_score += point
        elif opt == '*':
            point *= 2
            total_score += point + prev_pt
            prev_pt = point
        else:
            prev_pt = point
            total_score += point
    return total_score

def calculate_score(score_str):
    return tuples_to_score(str_to_iter_tuples(score_str))

###

test_cases = [
    ('1S2D*3T',  37, [(1,1,None), (2,2,'*'), (3,3,None)]),
    ('1D2S#10S',  9, [(1,2,None), (2,1,'#'), (10,1,None)]),
    ('1D2S0T',    3, [(1,2,None), (2,1,None), (0,3,None)]),
    ('1S*2T*3S', 23, [(1,1,'*'), (2,3,'*'), (3,1,None)]),
    ('1D#2S*3S',  5, [(1,2,'#'), (2,1,'*'), (3,1,None)]),
    ('1T2D3D#',  -4, [(1,3,None), (2,2,None), (3,2,'#')]),
    ('1D2S3T*',  59, [(1,2,None), (2,1,None), (3,3,'*')])
]

for score_str, _, tuples in test_cases:
    assert list(str_to_iter_tuples(score_str)) == tuples

for _, expected_score, tuples in test_cases:
    assert tuples_to_score(tuples) == expected_score

for score_str, expected_score, _ in test_cases:
    total_score = calculate_score(score_str)
    assert total_score == expected_score
    print(score_str, total_score)

직접 실행해보기: https://tech.io/snippet/goMCpvi

Takeaways

  • 간단한 정규식이라도 테스터 없이 만들기는 쉽지 않다.
  • 문자열 파싱과 점수 계산 로직을 별도의 함수로 만들었다.