[Objective C - ios] 사이냅소프트(Synapsoft) 2014 채용 퀴즈 풀이
채용 퀴즈
엑셀과 같은 스프레드시트에서, 컬럼 이름은 첫번째가 A, 두번째가 B... 같은 식인데,
26번째인 Z 다음부터는 AA, AB,.. 처럼 됩니다.
숫자를 입력받으면 그 순서에 대응되는 엑셀 컬럼을 출력하는 프로그램을 작성하세요.
프로그래밍 언어의 제약은 없으며, 외부 라이브러리를 쓰시는 경우 용도를 같이 명시해 주세요.
26번째인 Z 다음부터는 AA, AB,.. 처럼 됩니다.
숫자를 입력받으면 그 순서에 대응되는 엑셀 컬럼을 출력하는 프로그램을 작성하세요.
프로그래밍 언어의 제약은 없으며, 외부 라이브러리를 쓰시는 경우 용도를 같이 명시해 주세요.
풀이동기
2013년 10월 30일 개발자에게 복지 좋은 회사가 채용공고를 냈다는 소식을 듣고, 다음날 아침 facebook을 통해 직접 Synapsoft 채용공고소식을보게 되었습니다. 처음 채용공고소식과 함께 엑셀열과 같이 A~Z까지 표기를 하는 문제를 대충 듣게 되었고, 한번 쯤은 연습삼아 풀어보아야겠다는 생각을 했습니다. 그러나 문득 마감일자가 10월 31일인 것을 보고 부랴부랴 풀이를 시작했지만 코드완성시간이 부족하여 지원하진 못 했습니다.ios 개발을 꿈꾸며 objective-c 공부를 시작했고, 간단하지만 첫 작품을 내 손으로 만들어보겠다는 마음으로 문제풀이를 중단하지 않고, 계속 진행했습니다. 내 손으로 만든 간단한 첫 어플이자, 처음으로 unit test를 작성한데 의의가 큽니다. 또한 모든 부분에 대하여 unit test를 작성하진 않았지만, TDD의 장점을 직접 체험할 수 있었던 값진 경험이기도 합니다.
풀이시작
26진수 변환
A~Z는 26개문자입니다. 2진수는 0~1로 표기하지만 2개의 숫자로 표기합니다..
16진수는 2진수와 달리 1~10ABCDEF로 16개로 표기를 한다. 그래서 26진수로 변환을 하고 각 자리마다의 상수를 문자로 변경하는 방식으로 풀이를 시작했습니다.
알고리즘 산출
문자를 26진수로 표현하고 알고리즘을 산출했습니다.
예) "AAA" = 1 * 26^2 + 1 * 26^1 + 1 * 1 = 703
" ZZZ" = 26 * 26^2 + 26 * 26^1 + 26 * 1 = 18,278
알고리즘 주요포인트
1. 나머지가 0으로 떨어지는 경우,
26으로 나누어 떨어진단 얘기입니다. 예를 들어 문자 "ZZZ"의 경우 26(26^2 + 26^1 + 1)로 표현되며, 나머지가 0이면 26번째 문자에 해당 된다는 것을 알 수 있습니다.
2. 나머지가 0이 아닌 경우,
문자 "Z"에 해당되지 않으며, 26보다 작은 숫자이기 때문에 그에 맞는 문자로 바로 변경을 하면 됩니다.3. 나머지를 문자로 변경한 이후,
Z"에 해당되었다면, 26을 빼주고, 26으로 나누어줍니다. 나누어지지 않은 경우엔 그 해당 나머지를 빼줍니다. 그리고 다시 26으로 나누고, 위와 같은 과정을 반복하며 문자열 하나하나 찾아줍니다. 이때 찾는 순서는 오른쪽 부터(1의자리) 찾게 됩니다.
재귀함수
주어진 숫자가 26으로 나누어지지 않을 경우(26보다 작은 숫자)가 생길 때까지, 나머지를 찾아 빼고, 26으로 나누고, 다시 나머지를 찾아 빼고, 26으로 나누는 행위가 반복됩니다. 이는 재귀함수를 사용하여 구현하였고, 공개 소스의 appSolution.m 에 아래의 method 이름으로 구현되어있습니다.
- (void) decTo26s:(int)dec
테스트케이스
SynapsoftQuizTests.m 파일에 unit test 구현
- DATA SOURCE 갯수 확인 (A-Z 26문자 array count)
- 1~26까지의 숫자로 알맞은 알파벳 return 확인
- 숫자 입력하고, 알맞은 문자열 return 확인
- 숫자 입력으로 return된 문자열이 맞는지, 역으로 계산하여 숫자 return 확인
총 4개의 test case 작성되었습니다.
소스공개
알고리즘 찾는 과정 - 노트캡쳐 |
26진수라~ 기발한데? 사라있네 ㅎㅎ
답글삭제