입사시험..

litnsio2의 이미지

오늘 모 업체 입사지원 면접을 봤습니다.

테스트(시험) 한시간에, 면접관들과 인터뷰를 보는 형식으로 진행하더군요.
먼저 문제... 현 회사가 기술을 겉핧기 식으로 다루다 보니 저도 많이 변했는지 답을 적기가 애매한 문제도 보이더군요. 언젠가 책에서 보던 어렴풋한 개념들. 지금 생각해도 많이 반성해야 할 부분입니다. 고수가 왜 기초수련을 게을리 하지 않는지 이제야 알겠더군요. 한동안 비전공 분야의 책만 탐독했는데, 이제 독서스타일을 조금 바꿔야겠습니다.

각설하고, 마지막 문제.. 코드를 적는 문제였습니다. C코드를 가지고 다음의 조건에 만족하는 출력을 내는 함수를 작성하는 것이었습니다.

1. "1234 abcd 한글 출력" 이 입력으로 오면 "한글 출력 dcba 4321"을 출력한다.
2. "1234 이것은 한글 출력 입니다 abcd" 이 입력으로 오면 "입니다 이것은 한글 출력 dcba 4321"을 출력한다. (1.번 조건은 정확히 기억하는 것이고 이 조건은 어렴풋한 기억을 떠올려 적은 것입니다.)
3. 입력 문자열은 ascii multibyte라고 가정한다.
4. 입력 문자열의 크기는 1024 byte를 넘지 않는다.
5. 사용가능한 라이브러리 함수는 printf와 strlen 이다.

void out(char *aChar)
{
/* 이곳을 채워 넣는다 */

}

제가 바보라 그런지 당췌 모르겠더군요. 그래서 그냥 작게 이렇게 적었습니다. (어쨌든 요구사항을 만족하는 결과를 내니깐요)

if( strlen(aChar) > 30 )
printf("입니다 이것은 한글 출력 dcba 4321");
else
printf("한글 출력 dcba 4321");

그리고 제가 생각하는 방법을 적용한 방법을 또 적었습니다. 예를 들어 1번의 조건의 경우
if( strlen(aChar) < 30 ) {
printf("%s", aChar+10);
SWAP("abcd" to "dcba"); 배열원소를 swap 하는 의사코드
aChar[10] = 0;
printf(" %s", aChar+5); // dcba 출력 (aChar[10] 이전위치까지만..)

.. // 1234도 위와 마찬가지로 4321로 출력..
}

이정도가 제가 생각한 방법인데, 혹시 다른 아이디어로도 접근이 가능할런진요..? -_-a

그리고 "4. 입력 문자열의 크기는 1024 byte를 넘지 않는다." 를 보고 "입력 문자열은 조건1, 2가 아닌 다른 경우가 올 수도 있다" 라고 생각하시는분 계신가요?

Llain의 이미지

프로그램명.exe <입력> 이라면 버퍼를 그대로 사용하고 싶어지네요 뭐. 제 생각에는 저 입력이 아닌 그냥 저 순서대로 아무렇게나 넣는다는 것 같이 보여요
-----------------------------------------------------
자신의 열정! 용기! 근성! 만이 자신을 표현할 수 있다
* 좋은 하루 및 좋은 세상이 되기를 바랍니다 *

-----------------------------------------------------
자신의 열정! 용기! 근성! 만이 자신을 표현할 수 있다
* 좋은 하루 및 좋은 세상이 되기를 바랍니다 *

bushi의 이미지

ascii multibyte 가 ... 흠...

null terminate 규칙을 따르고,
(추측)단어는 항상 공백문자를 사용해서 다른 단어와 구분되고,
(추측)한번 한글이면 그 단어 끝까지 한글이고,
(추측)한번 영문이면 그 단어 끝까지 영문이고,
(추측)한번 숫자면 그 단어 끝까지 숫자고,
한글을 제일 먼저, 영문, 숫자 순으로 정렬하면 되고,
한글이 아니라면 단어단위에서 다시 순서를 뒤집고,
...
한글단어끼리의 우선순위에서 규칙성을 못 찾겠습니다.
설마... 서술어인지 아닌지까지도 구분해야한다면... 구문분석을 위한 알고리즘을 첨가해야겠죠.

입력문자열이 1024바이트를 넘지않는다는 조건은,
malloc 을 쓰지말고 필요하면 static 배열을 사용하라는 의미 이상도 이하도 아닌 것 같고요.

아무튼,
isalnum() 혹은 iswcalnum()
isalpha() 혹은 iswcalpha()
를 직접구현해야겠습니다.
입력이 char** 가 아니라 char* 라면
isspace() 혹은 iswcspace()
도 필요하고요.
나머진 for 루프에 포인터 장난질.

+
매크로들

#define _isalpha(_x) \
 (((((_x) >= 'a') && ((_x) <= 'z')) || (((_x) >= 'A') && ((_x) <= 'Z')))?1:0)
#define _isnumber(_x) \
 ((((_x) >= '0') && ((_x) <= '9'))?1:0)
#define _isspace(_x) \
 (((_x) == ' ')?1:0)

1024 를 활용
char *unknowns[1024];
int nr_unknowns = 0;
char *alphas[1024];
int nr_alphas = 0;
char *numbers[1024];
int nr_numbers = 0;
 
#define _add_word(_name, _pchar) \
  _name[nr_##_name++] = _pchar
 
void add_word(char *input_word)
{
        if (_isalpha(*input_word))
                _add_word(alphas, input_word);
        else if (_isnumber(*input_word))
                _add_word(numbers, input_word);
        else
                _add_word(unknowns, input_word);
}

단어 단위로 잘라내기는
void handle_str(char **input_str, int nr_input_str)
{
        char *endp, *sp, *tp;
 retry:
        if (!nr_input_str--)
                return;
        endp = *input_str + strlen(*input_str);
        sp = tp = *input_str;
        while (tp < endp) {
                if (!_isspace(*tp)) {
                        tp++;
                        continue;
                }
                *tp++ = 0;
                add_word(sp);
                sp = tp;
        }
        if (*sp)
                add_word(sp);
        input_str++;
        goto retry;
}

문제의 아리송한 출력 순서부분
void _handle_alnum(char *alnum)
{
        int i = strlen(alnum);
        for (; i > 0; i--)
                printf("%c", *(alnum + i - 1));
        printf(" ");
}
 
void handle_words(void)
{
        int i;
        for (i = nr_unknowns ; i; i--)
                printf("%s ", unknowns[i-1]);
        for (i = nr_alphas; i; i--)
                _handle_alnum(alphas[i-1]);
        for (i = nr_numbers; i; i--)
                _handle_alnum(numbers[i-1]);
}

main()
int main(int argc, char **argv)
{
        argv++;
        argc--;
        handle_str(argv, argc);
        handle_words();
        printf("\n");
        return 0;
}

시험
[bushi@rose tmp]$ ./c 1234 이것은 한글출력 입니다 abcd
입니다 한글출력 이것은 dcba 4321 
[bushi@rose tmp]$ 
[bushi@rose tmp]$ ./c "1234 abcd 한글출력"
한글출력 dcba 4321 
[bushi@rose tmp]$

OTL
minq1205의 이미지

한글을 먼저출력하고 한글이아니면 마지막에서 부터 읽어 출력 하는게 아니였을까 하는 생각을 해봐요.

===============================
재미를 추구하지만 재미없는 '놈'입니다.

minq1205의 이미지

위에분이 이야기하셨었군요 =_=

===============================
재미를 추구하지만 재미없는 '놈'입니다.