한메타자 같은 타이핑게임 만들기(업그레이드)에 오류가 있는 것 같습니다!

미해결질문
rn0731 프로필

만약 문제가 "남박사"라고 한다면

"남박상"이라고 입력했을 때 정확도 100%가 나오게 됩니다.

그리고 

"나박사"라고 입력하면 정확도가 실제 정확도보다 낮게 나옵니다.

break_korean을 했을 때 문제단어는 ['ㄴ', 'ㅏ', 'ㅁ', 'ㅂ', 'ㅏ', 'ㄱ', 'ㅅ', 'ㅏ']이고

사용자 입력은  ['ㄴ', 'ㅏ', 'ㅂ', 'ㅏ', 'ㄱ', 'ㅅ', 'ㅏ'] 이기에

'나'를 지나고 '박사'는 제대로 대응되서 계산하지 못합니다.

어떻게 해결해야 될까요?

남박사 프로필
남박사 9달 전

이 강좌는 사실 주 목적은 유니코드에 대한 내용을 이야기 하고자 만들어진 강좌이며 그걸 좀 더 흥미롭게 하기 위해 타이핑 게임이라는 소재를 활용했습니다. 그렇기 때문에 실제 한메타자 같은 타이핑 게임의 완성도에 비해선 떨어질 수 밖에 없는게 사실입니다. 타자게임의 목적에 치중해서 강좌를 만들면 사실 유니코드 내용에 초점이 맞춰지지 않기도 하고 다른 내용이 훨씬 더 복잡해 질 수 있는 문제가 생기기 때문입니다.

일단 말씀하신 내용은 정확도를 판단하는 로직이 단순하게 사용자가 입력한 내용을 초중종성으로 분리해서 각 글자의 위치만 매칭해보기 때문에 생기는 문제입니다. 실제로 타이핑 게임을 생각해보면 그보다 훨씬 더 많은 경우의 수가 있습니다. 말씀하신것 처럼 문제가 "남박사" 라고 가정하고 이야기 해보면

사용자가 "남박상" 이라고 입력한경우 출제 문제의 글자수보다 더 많이 입력된경우

사용자가 "남박" 이라고 입력한경우 출제 문제의 글자수보다 적게 입력된경우

이거 두가지만 처리한다고 해도 기존의 로직으로는 정확도를 계산하기 힘듭니다. 그리고 더 중요한건 정확도와 오류율을 어떻게 정의할지도 식을 생각해봐야 합니다. 일단 즉흥적으로 코드를 짠거라 참고하셔서 이렇게도 하는구나 정도로 보셨으면 좋겠습니다.

# 오타글자 카운팅 변수
    error = 0
    # 글자 입력이 모자란 경우를 체크하기 위한 변수
    last_pos = 0
    for i in range(len(q)):
        c = q[i]
        if i >= len(user_input):
            break

        # 입력된 글자를 최종 확인한 위치 기억
        last_pos = i
        # 입력된 글자중 i 번째 글자 v
        v = user_input[i]
        # 문제와 글자가 일치 하지 않으면
        if c != v:
            # 문제를 초,중,종성 분리
            break_q = break_korean(c)
            # 문제의 초,중,종성 갯수를 오류로 판단
            error += abs(len(break_q))
    
    # 사용자가 입력한 글자와 문제의 글자수를 확인하기 위해서
    # 위에서 저장한 last_pos 값과 문제의 길이를 비교
    mod = len(q) - (last_pos + 1)
    # 사용자가 문제보다 입력한 글자수가 적다면
    if mod > 0:
        # 모자란 글자수만큼 루프
        for i in range(mod+1, len(q)):
            # 해당 하는 글자수만큼 오류카운팅
            break_char = break_korean(q[i])
            error += len(break_char)
    
    src = break_korean(q)
    total_len = len(src)
    error_len = error
    print(total_len, error_len)

위 코드는 결국 최종적으로 문제의 총 글자(초/중/종성)수와 틀린 글자수를 뽑아내게 됩니다. 이 2가지 데이터로 정확도와 오타율을 다시 계산하시면 전에 작성된 코드보다는 좀 더 정확도가 높아질듯 보입니다만 이 역시 즉흥적으로 생각나는데로 코딩한거라 미처 생각하지 못한 더 많은 경우의 수가 있을 수 있으니 참고하시기 바랍니다.

rn0731 프로필
rn0731 9달 전

와우! 당신의 지식에 감탄합니다:)

지식공유자 되기
많은 사람들에게 배움의 기회를 주고,
경제적 보상을 받아보세요.
지식공유참여
기업 교육을 위한 인프런
“인프런 비즈니스” 를 통해 모든 팀원이 인프런의 강의들을
자유롭게 학습하는 환경을 제공하세요.
인프런 비즈니스