작성
·
301
답변 2
0
0
이 강좌는 사실 주 목적은 유니코드에 대한 내용을 이야기 하고자 만들어진 강좌이며 그걸 좀 더 흥미롭게 하기 위해 타이핑 게임이라는 소재를 활용했습니다. 그렇기 때문에 실제 한메타자 같은 타이핑 게임의 완성도에 비해선 떨어질 수 밖에 없는게 사실입니다. 타자게임의 목적에 치중해서 강좌를 만들면 사실 유니코드 내용에 초점이 맞춰지지 않기도 하고 다른 내용이 훨씬 더 복잡해 질 수 있는 문제가 생기기 때문입니다.
일단 말씀하신 내용은 정확도를 판단하는 로직이 단순하게 사용자가 입력한 내용을 초중종성으로 분리해서 각 글자의 위치만 매칭해보기 때문에 생기는 문제입니다. 실제로 타이핑 게임을 생각해보면 그보다 훨씬 더 많은 경우의 수가 있습니다. 말씀하신것 처럼 문제가 "남박사" 라고 가정하고 이야기 해보면
사용자가 "남박상" 이라고 입력한경우 출제 문제의 글자수보다 더 많이 입력된경우
사용자가 "남박" 이라고 입력한경우 출제 문제의 글자수보다 적게 입력된경우
이거 두가지만 처리한다고 해도 기존의 로직으로는 정확도를 계산하기 힘듭니다. 그리고 더 중요한건 정확도와 오류율을 어떻게 정의할지도 식을 생각해봐야 합니다. 일단 즉흥적으로 코드를 짠거라 참고하셔서 이렇게도 하는구나 정도로 보셨으면 좋겠습니다.
# 오타글자 카운팅 변수
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가지 데이터로 정확도와 오타율을 다시 계산하시면 전에 작성된 코드보다는 좀 더 정확도가 높아질듯 보입니다만 이 역시 즉흥적으로 생각나는데로 코딩한거라 미처 생각하지 못한 더 많은 경우의 수가 있을 수 있으니 참고하시기 바랍니다.