코딩 인터뷰 완전 분석 210쪽 17.3 변형 문제 풀이 (2)

앞에서의 문제를 남들은 별 해괴한 언어로 풀길래, 나도 한번 똑같은 문제를 C 언어를 사용해서가 아닌 좀 다른 언어를 사용해서 만들어보았다.  바로 graphical language 라고 할 수 있는 simulink 이다.

별 문제 없이 슥슥 만들 수 있을 줄 알았는데 왠걸, 예상보다 상당히 오래 걸렸다. 기존의 절차형 프로그래밍과는 미묘하게 다른 제어용 프로그래밍인데다가, simulink 의 while 문이 익숙지 않아서 (리얼타임 제어에서 while 문을 써 봤을 리가-_-) 헤매다가 에잇 때려치워 하고는 마구잡이로 만들어버렸다 (…)

자세한 건 좀 이따 말하기로 하고, 일단은 실행화면이다. 첫번째 문제, 2012! 구하기.


답으로 0이 501개, 0이 아닌 마지막 수 8이 잘 출력된 걸 알 수 있다. 그다음 문제, 10000! 구하기 스샷.

0이 2499개, 0이 아닌 마지막 숫자 8이 제대로 출력된다.

전체 simulink 모델이야 위 스샷에 이미 다 나와있고, sub block 들은 다음과 같이 작성했다.

글자 그대로 factorial 을 계산하는 블럭이다. 출력1을 feedback 해서 입력2로 넣어주면 되는 구조이다. 물론 이 프로그램에서는 그대로 입력으로 넣어주지 않고 숫자를 줄이기 위한 트릭을 사용한다.

입력의 숫자에서 뒤에 0이 몇 개인지 보고 0의 갯수와 0을 잘라내고 남은 갯수를 구해내는 블럭이다. 이 sub model 이 제일 아쉬운데, is remnant zero 블럭을 1개만 써서 만들어보고 싶었지만 잘 되질 않아서 저렇게 만들어버리고 말았다. 향후 수정이 필요하다. (흑흑)

위 zero truncate 블럭의 sub block 이다. C 언어로 치자면 % 연산을 해서 0으로 나눠 떨어지는지 여부를 알려주고 / 연산의 값을 출력한다. simulink 내에서 matlab 서브루틴을 사용하면 간단히 되겠지만 이번에는 simulink 를 고집했기 때문에 이렇게 만들었다.

이건 큰 숫자에서 연산으로써 의미가 있는 뒷자리만 잘라내는 블럭이다. 그리고 프로그램 종료까지 확인해준다. 이것도 switch 블럭을 마구 쓰지 않고 뭔가 쌈빡하게 하는 방법이 있을텐데, 귀차니즘의 발동으로 그냥 저렇게 만들어버렸다. (뭐 어때! 돌아가기만 하면 되지! 주의랄까 -_-)

프로그램이란 것이 만들어놓고 나면 항상 아쉬운 법이라, 언제 한번 시간을 내서 좀 더 멋지게 다듬어볼 생각이다. 버뜨 회사 프로젝트 마감일이 목을 졸라와서-_- 일단은 이정도로 만족하기로 한다.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중

%d 블로거가 이것을 좋아합니다: