X

뉴스레터를 구독하세요.

분기에 한번, 핵심 소식을 전달 드립니다!

개인정보 수집 및 이용

뉴스레터 발송을 위한 최소한의 개인정보를 수집하고 이용합니다. 수집된 정보는 발송 외 다른 목적으로 이용되지 않으며, 서비스가 종료되거나 구독을 해지할 경우 즉시 파기됩니다.

2019 2차 채용퀴즈 해설

2020-01-02 | 채용 및 퀴즈

안녕하세요 사이냅소프트입니다.
11월에 이어 다시 한 번 채용퀴즈 해설로 인사 드립니다. 이번 2차 공채에도 어김없이 사이냅소프트 채용의 꽃 ‘채용퀴즈’가 출제되었습니다.

지난번에도 소개 드렸던 것처럼 사이냅소프트의 ‘채용퀴즈’는 문제 요구사항을 정확히 이해하고 문제를 다양한 방식으로 해결해 나아가는 지원자의 모습을 보고자 함에 있습니다. 즉, 문제를 푸는 최적의 방법이 있을 수 있겠지만 정답이 없다는 이야기입니다. 채용퀴즈 풀이를 통해 여러분의 기발한 아이디어를 마음껏 펼쳐보세요.

사이냅소프트의 채용퀴즈 해설을 보시고 내 접근방법과는 어떻게 다른지, 어떻게 하면 더 효율적으로 작성할 수 있을지에 대한 아이디어를 얻으셨으면 좋겠습니다.

그럼 2차채용퀴즈 해설 시작합니다.

문제 설명

우리말을 쓰는 평범한 사람이라면 1억원, 1조원을 일억 원, 일조 원이라고 읽지 억원, 조원이라 읽지 않습니다. 반면에 1만원, 1천원, 1백원의 경우는 일만 원, 일천 원, 일백 원이라 읽지 않고 만원, 천원, 백원, 십원이라 읽습니다.

또한 ‘80,270원’처럼 금액의 표기는 천 단위로 콤마를 찍지만 실제로 읽을 때는 ‘팔만 이백칠십원’처럼 만 단위로 분리하여 읽습니다.

“배조스님의 계좌에서 사이냅소프트님의 계좌로 일조 사천 일백 팔십 오억 원을 이체합니다. 동의하시면 1번을…”

계좌이체 음성안내의 부자연스러운 금액 표현과 띄어 읽기가 거슬렸던 암아존 배조스씨를 위해 이체금액을 한글로 자연스럽게 읽을 수 있는 프로그램을 작성해서 보내주세요. 프로그래밍 언어는 가장 자신 있는 것을 사용하세요.

 

– 입력

암아존 배조스님의 은행 이체한도는 100조원으로 설정돼 있으므로 입력 금액의 범위는 1원에서 100조원까지입니다. 모든 금액은 천 단위 구분자인 콤마가 표시돼있고 금액단위인 원으로 끝납니다.

예로 아래와 같은 입력이 가능합니다. 입력은 별도 파일에서 읽어와도 되고, 소스코드 안에 포함시켜도 됩니다. 물론 UI를 만들어 사용자로부터 직접 입력을 받아도 좋습니다.

1원
80,270원
111,111원
1,234,567,890원
100,000,000,000,000원
– 출력

입력에 대하여 만 단위 띄어쓰기로 구분된 자연스러운 한글읽기를 출력합니다.

위 예의 출력은 다음과 같습니다.

일원
팔만 이백칠십원
십일만 천백십일원
십이억 삼천사백오십육만 칠천팔백구십원
백조원

문제풀이

[시작]

특수한 경우를 제외하고 구현할 경우 아래처럼 하면 됩니다.

 

add_str = { 3:'조 ', 7:'억 ', 11:'만 ', }
read_text = ["", "일", "이", "삼", "사", "오", "육", "칠", "팔", "구"]
t = ["천", "백", "십", ""]
def read_num(numstr) :
numstr = numstr[:-1].replace(",","")
num = int(numstr, 10)
if not (1 <= num <= 100000000000000) :
return "이체범위를 벗어났습니다"
numstr = numstr.rjust(16, '0')
kr_buf = []
for idx, ch in enumerate(numstr) :
n = int(ch , 10)
if n > 0 :
kr_buf.append( read_text[ n ] + t[ idx % 4 ] )
if (idx in add_str) and int(numstr[idx-3:idx+1], 10) > 0 :
kr_buf.append( add_str[idx] )
kr_str = "".join(kr_buf).strip() + "원"
return kr_str

코드를 간단하게 하기 위해 입력에 숫자만 남긴 후 왼쪽에 0을 덧붙여서 16자리로 만듭니다. 이렇게 하지 않을 경우 조 단위는 3자리이고 나머지는 4자리가 되기 때문에 코드가 복잡해집니다.

그 후에 차례로 돌면서 한글로 변환하여 결과에 덧붙입니다. 이 때 조, 억, 만 단위에 숫자가 있는 경우 해당 글자를 덧붙입니다.

하지만 이렇게 처리하면 십, 백, 천 단위 앞에는 1이 붙어서 요구사항과 다른 값이 출력됩니다. 그럼 요구사항에 맞게 코드를 수정해보겠습니다.

[십, 백, 천 단위 처리]

십, 백, 천 단위 앞에 1은 항상 생략하기 때문에 전체 문자열에 대해 치환하면 됩니다.

add_str = { 3:'조 ', 7:'억 ', 11:'만 ', }
read_text = ["", "일", "이", "삼", "사", "오", "육", "칠", "팔", "구"]
t = ["천", "백", "십", ""]
def read_num(numstr) :
numstr = numstr[:-1].replace(",","")
num = int(numstr, 10)
if not (1 <= num <= 100000000000000) :
return "이체범위를 벗어났습니다"
numstr = numstr.rjust(16, '0')
kr_buf = []
for idx, ch in enumerate(numstr) :
n = int(ch , 10)
if n > 0 :
kr_buf.append( read_text[ n ] + t[ idx % 4 ] )
if (idx in add_str) and int(numstr[idx-3:idx+1], 10) > 0 :
kr_buf.append( add_str[idx] )
kr_str = "".join(kr_buf).strip() + "원"
kr_str = "".join(kr_buf).strip().replace("일천", "천").replace("일백", "백").replace("일십", "십") + "원"
return kr_str

이 경우에도 만 단위 처리에 오류가 발생합니다. 만 단위 처리를 위한 코드 수정을 해보겠습니다.

[만 단위 처리]

만 단위 처리는 십, 백, 천 단위 처리보다 조금 복잡합니다. 만 단위처리의 경우 아래 규칙을 생각하셔야 합니다. 이 부분을 놓치고 많은 분들이 만 단위를 제대로 처리하지 않고 퀴즈 풀이를 제출하셨습니다.

  • 만 단위에 십 단위 이상이 있는 경우 1이 있으면 그대로 읽습니다.
  • 그렇지 않은 경우 1을 붙이지 않고 읽습니다.

10,000 => 만
110,000 => 십일만
2,010,000 => 이백일만

위 규칙에 따라 코드를 수정하면 다음과 같습니다.

add_str = { 3:'조 ', 7:'억 ', 11:'만 ', }
read_text = ["", "일", "이", "삼", "사", "오", "육", "칠", "팔", "구"]
t = ["천", "백", "십", ""]
def read_num(numstr) :
numstr = numstr[:-1].replace(",","")
num = int(numstr, 10)
if not (1 <= num <= 100000000000000) :
return "이체범위를 벗어났습니다"
numstr = numstr.rjust(16, '0')
kr_buf = []
for idx, ch in enumerate(numstr) :
n = int(ch , 10)
if n > 0 :
kr_buf.append( read_text[ n ] + t[ idx % 4 ] )
if (idx in add_str) and int(numstr[idx-3:idx+1], 10) > 0 :
kr_buf.append( add_str[idx] )
kr_str = "".join(kr_buf).strip().replace("일천", "천").replace("일백", "백").replace("일십", "십") + "원"
if ("십일만" not in kr_str) and ("백일만" not in kr_str) and ("천일만" not in kr_str) :
kr_str = kr_str.replace("일만", "만")
return kr_str

마치며

이번 포스팅에서 소개한 코드는 간단하게 설명하기 위해 비효율적으로 되어있습니다. 코드를 더 효율적으로 구현하는 것은 이 글을 읽는 분들에게 숙제로 남깁니다. 검색을 해보면 다양한 구현 방법을 찾을 수 있기 때문에 그리 어렵지는 않을 것입니다.

여러분들께서는 어떤 방식으로 코드를 작성하셨나요? 여러분의 코드를 소개해 주세요.
문제에 대한 의견이나 궁금한 내용이 있으시면 mkt@synapsoft.co.kr 로 메일 주세요. 사이냅소프트는 여러분의 목소리를 기다리고 있습니다.

감사합니다.

사이냅 문서뷰어

어디서 어떻게 사용되고 있을까요?

사이냅 문서뷰어의 적용사례를 만나보세요

[개인정보 수집, 이용에 대한 동의 절차]

사이냅 문서뷰어 적용사례를 만나보세요

차원이 다른 HTML5 웹에디터

사이냅 에디터

사이냅 에디터가 어디에 활용될 수 있을까요?
다양한 적용사례를 만나보세요

[개인정보 수집, 이용에 대한 동의 절차]

한 차원 높은 HTML5 웹에디터를 만나보세요