2009년 다음 입사시험 문제


2009년 후반기 다음 입사시험 문제 중 일부. 입사시험은 크게 두 부분으로 나뉘는데, 전산일반과 DB, SQL, 프로그래밍 일반 등에 대한 단답식 문항들이 1 영역이고, 2 영역은 코딩 테스트. 아래 내용은 2영역의 문제다.


1. 문자열을 역순으로 출력하는 함수를 작성하시오. 예를들어 1423을 입력했으면 3241, 1320을 입력했으면 231이 나와야 합니다. 아래의 프로토타입에 맞게 작성하시오. 단 입력값이 잘못되었다거나, 계산할 수 없는 경우를 고려하여 이상한 출력이 발생하지 않도록 해야 함.(예외처리)

int reverse(int input);


2. 임의의 문자열 S가 있다고 했을 때, 문자열 중 연속되는 문자열 중, 2번 이상 중복되는 것만을 골라낸 후, 그 중 가장 긴 문자열의 시작 위치를 반환하는 함수를 작성하시오.

S=[abeabcdefkkkabcd]라고 한다면, 연속되는 문자열은 "ab", "abcd", "abcdef"이며, 이 중 2회 이상 중복되는 문자열은 "ab", "abcd"이다. "abcdef"는 1회만 등장하므로 제외.

"ab"보다 "abcd"가 문자열 길이가 기므로, 함수는 "abcd"의 위치를 리턴해야 한다. 맨 앞을 0번째라고 했을 때, 3번째 혹은 12번째가 답이 될 것이다. 이 중 무엇을 리턴하던 상관은 없다.(작성자 자유)

단, 전체 문자열의 길이는 1000을 넘지 않는다고 가정한다.

(원래 이 문제는 해결 알고리즘을 슈더코드나 설명으로 제시하는 것이 첫번째 문제고, 해당 알고리즘의 원리나 장단점, 효율성 등을 설명한 후 시간복잡도를 계산하고, 마지막으로 코드를 작성하게끔 되어 있는 문제였으나, 편의상 저렇게 하였다.

 

3. 1차원의 점들이 주어졌을 때, 그 중 가장 거리가 짧은 것의 쌍을 출력하는 함수를 작성하시오. 단 점들의 배열은 모두 정렬되어있다고 가정한다.

S={1, 3, 4, 8, 13, 17, 20}이 주어졌다면, 결과값은 (3, 4)가 될 것이다.

단, 디바이드 앤 컨커 기법을 반드시 써야 함.


예상보다는 쉬운 문제였으나, 디버거가 없는 현실-_-덕에 조금 고생했다. 난 체질적으로 디버거 돌리면서 코딩해야 하는데!; 꼭 전문 디버거가 아니더라도(임베디드 개발환경 등에서는 디버거가 지원되지 않는 경우도 흔하다.) printf 등으로 값을 찍거나 레지스터, 메모리 등을 덤프 떠 보면서 디버깅하는 게 내 습관이거든-_-

또 손코딩의 힘든 점은 코드를 쓰다가 뭐 변수를 빼먹거나 과정 하나를 빼먹거나 하여, 나중에 아차 싶어 위 라인에 뭔가를 추가하려 들면, 자리가 없어서 결국 아래에 쓴 걸 다 지우고 다시써야 하는..-_-;; 아니면 쓰고나서 생각해보니 버그가 있다거나 하는 경우. 컴퓨터로 코딩할 땐 즉석 수정이 가능하지만 손코딩은 그러기 힘들다.

어쨌든 시험시간 한시간 남기고 다 풀고 집에 왔긴 한데, 막상 돌아와서 생각해보니 영 어설프게 푼 것 같기도 하고.. 특히 1번 같은 건 진짜 쉬운 문제임에도 불구하고 리턴값을 반환하는 방식이 아닌 즉석에서 바로 찍어버리는 방법을 택해서, 어째 정해진 규약에 어긋나게 푼 것 같기도 하다. 문제를 차근히 읽지 않고 너무 성급하게 풀어버렸나 싶고..;

모르겠다. 붙으면 좋고 아니면 말고.. 저 정도 문제는 다들 잘 풀었겠지.

관심있는 분은 풀어봐도 괜찮을 것 같다.

-------------------------------------------------------------------------------------------------------

예전에 올렸다가 혹시 몰라서 비공개로 돌렸었는데, 이미 떨어진 마당에 뭐 어떠냐 싶고..(..) 그냥 올려봅니다.

그때 다 풀고 나오긴 했습니다만, 물론 제 답안은 탈락한 거라 별로 보실 필요는 없을듯 (...)




by highseek | 2009/10/29 21:40 | 트랙백 | 덧글(14)

트랙백 주소 : http://highseek.egloos.com/tb/1963397
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by 지나가다 at 2009/10/29 21:55
1번... ... int 형 입/출력인데요. 문자열 위치를 바꾸라는건 %10 해서 자리수 하나씩 빼서 바꿔야 하나요?;
Commented by highseek at 2009/10/29 22:00
아 네. 저게 사실 문자열이 아니라 그냥 숫자죠. %10과 /10을 이용해서 바꾸시면 됩니다.
Commented by 지나가다 at 2009/10/29 22:35
1번에서 예외처리가 대체 뭘까요... 음수랑 0 정도? 흠냐...;
Commented by highseek at 2009/10/29 22:37
뭐 음수랑 0, 그리고 정수가 아닌 값(문자, 부동소수)들 정도만 예외처리하면 될 듯 합니다.
Commented by 아일우드 at 2009/10/30 01:41
무엇인지 잘 모르겠지만..어려워보여..
Commented by highseek at 2009/10/30 01:42
....C언어는 C나라의 말이죠
Commented by 고스 at 2009/10/30 12:26
그냥 하라고 하면 구현하겠는데..
1. 해결 알고리즘을 슈더코드나 설명
2. 해당 알고리즘의 원리나 장단점, 효율성 등을 설명한 후
3. 시간복잡도를 계산하고, 마지막으로 코드를 작성
4. 디바이드 앤 컨커 기법

위의 1.2.3.4.는 전혀 못하겠네요.. ㅠㅠ
Commented by highseek at 2009/10/30 12:30
......어렵죠..(...)
Commented by dhunter at 2009/10/30 15:33
간만에 보다가 생각난건데...

signed integer 의 최대치가 2147483648 이니까... 사실 1,999,999,999 도 예외처리를 해야 할텐데 말이죠. 은근히 이것저것 함정이 많은 문제들이네요 전부.
Commented by highseek at 2009/10/30 15:35
....아뇨. 입력값 자체가 int이니 그런 것들은 애초에 입력값으로 들어올 수가 없을 듯 합니다..(..)
Commented by dhunter at 2009/10/31 04:10
어째서 입력값으로 들어오지 못한다고 생각하시는건가요? :)

계산의 편의를 위해 2byte int 로 가정하면 MAX 32767.

이때 10004를 뒤집으면 결과값이 40001 이 되는데, 2byte int의 표기 범위를 넘네요. 이거 예외처리 필요하지 않을까요? :)
Commented by highseek at 2009/10/31 12:03
아아 결과값 오버플로우 말씀이시군요? 입력값 말씀하시는 줄 알았..

int reverse(int input)
{
if(input <0 )
return -1;
else
{
double result=0;
while(input> 0)
{
result=((result*10) + (input%10));
input/=10;
}
if(result == (int)result)
return (int)result;
else
return -1;
}
}

이정도면 될듯..

혹시 이 시험 보셨나요.
Commented by dhunter at 2009/11/03 02:42
저는 컴소/컴공이 아니고, 소프트웨어 쪽의 IT보다는 좀 더 로레벨쪽이 최근의 관심사라서 다음이나 NHN은 쓰지 않았습니다 :)
Commented by highseek at 2009/11/03 02:42
그렇군요.

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶