트랙
/
Go
Go
/
연습 문제
/
OCR 숫자
OCR 숫자

OCR 숫자

보통

소개

절친한 친구 Marta는 최근 지역 역사 박물관의 소장품을 다루는 꿈같은 일자리를 구했어요. 프로그래밍에 관심이 많다는 걸 아는 Marta는, 컴퓨터 역사 전시회를 준비하다 직장에서 생긴 문제를 털어놓아요. 지역 대학의 수학과에서 역사적인 출력물이 담긴 상자 여러 개를 기증했지만, 문서 상태가 좋지 않아 텍스트를 디지털화하기로 결정했대요. 그런데 대학의 오래된 프린터는 텍스트를 표현하는 방식에 몇 가지 특이한 점이 있어서, 데이터를 성공적으로 추출하려면 친구에게 도움이 필요해요.

지침

광학 문자 인식(OCR)은 텍스트 이미지를 기계가 읽을 수 있는 텍스트로 변환하는 소프트웨어예요. 숫자를 나타내는 문자 격자가 주어지면, 격자를 숫자 문자열로 변환해요. 격자에 셀 줄이 여러 개 있으면, 출력에서는 각 줄을 ","로 구분해요.

  • 격자는 한 줄 이상의 셀로 이루어져요.
  • 격자의 각 줄은 하나 이상의 셀로 이루어져요.
  • 각 셀은 너비가 세 칸, 높이가 네 칸(3x4)이며 숫자 하나를 나타내요.
  • 숫자는 파이프("|"), 밑줄("_"), 공백(" ")을 사용해 그려요.

엣지 케이스

  • 입력 크기가 올바르지 않으면, 프로그램은 오류가 있음을 알려줘야 해요.
  • 입력 크기는 올바르지만 알아볼 수 없는 셀이 있으면, 프로그램은 그 문자에 대해 "?"를 출력해야 해요.

예시

다음 입력(주석 제외)은 "1234567890"으로 변환돼요.

      _  _     _  _  _  _  _  _  #
    | _| _||_||_ |_   ||_||_|| | # Decimal numbers.
    ||_  _|  | _||_|  ||_| _||_| #
                                 # The fourth line is always blank,

다음 입력은 "123,456,789"로 변환돼요.

    _  _ 
  | _| _|
  ||_  _|
         
    _  _ 
|_||_ |_ 
  | _||_|
         
 _  _  _ 
  ||_||_|
  ||_| _|
         

구현 참고 사항

지침의 1단계에서 설명한 대로 recognizeDigit 함수를 정의하되, 0부터 9까지 열 개의 숫자를 모두 인식하도록 만들어요. 매개변수와 반환 값은 마음에 드는 대로 정해도 되지만, 2단계에서 서브루틴으로 쓸 수 있게 만들어요.

2단계에서는 다음을 정의하고,

func Recognize(string) []string

recognizeDigit을 사용해 구현해요.

여기에서 테스트하는 입력 문자열은 각 줄의 시작에 \n이 있고 마지막 줄 끝에는 \n이 없어요. (이렇게 하면 raw 문자열 리터럴을 읽기 좋아요.)

보너스 점수를 원한다면, 형식이 잘못된 데이터도 우아하게 처리해 봐요. 일부만 채워진 셀은 어떻게 해야 할까요? 버릴까요? 공백으로 채울까요? "?" 문자로 알려줄까요? 첫 문자가 \n이 아니면 어떻게 해야 할까요?

GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Go Exercism

OCR 숫자 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Go 트랙을 개념 34개연습 문제 165개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.