이스트소프트 실기시험 후기

나도 다른 블로그를 돌아다니며 이것저것 본게 많았어서 여기에 써본다. 2012년 9월 19일 실기시험을 치르고 왔다. 오늘본 시험이기에 지금은 뇌가 싱싱하니 이렇게 적어둔다. 아마 이 글은 내가 입사지원 결과가 최종적으로 나올 때까지는 공개할 수 없을 것 같다. 그 이후에 공개해야지.

혹시 이 문제를 공개하는 것에 대해 이스트소프트 관계자분이 문제를 제기하면 글은 내리겠다. 그런데 실기시험 문제지에도 문제를 외워서 공개하는 것에 대해서도 어떤 제한이 있다고 쓰여있진 않았으니 공개해도 될 것 같다.

오후 1시부터 6시까지 이루어진 실기시험. 딱 한문제 푸는건데 그게 그렇게 어렵다. ㅡㅡ;; 시험은 C/C++/PHP/Java가 가능하다. 노트북이 지급되었고 비주얼스튜디오2008과 이클립스가 설치되어 있었다. 난 비주얼스튜디오로 작업시작.

간단한 안내설명을 듣고 본격 프로그래밍 시작이다. 자기가 만든 프로그램은 이스트소프트에서 제공하는 검증프로그램으로 검증해볼 수 있다. 내가 만든 파일(.exe/.class/.php)을 지정하면 결과값이 제대로 나오는지 확인해준다. 이 프로그램을 쓰며 알게된건 검증프로그램이 총 6가지문제를 테스트 할 수 있도록 되어있었다. 이것은 곧 실기시험에 나오는 문제가 6가지 중의 하나란 얘기. 인터넷 여기저기를 찾아보며 기출문제 여섯가지만 다 풀어보면 실기시험은 무조건 패쓰 할 수 있다는 얘기가 된다.

내가 받은 시험문제는 다음과 같다. 시험이 끝날 때 시험문제지를 다 거둬가기 떄문에 적어온 것은 없고 내 머릿속에 기억해온 것만 적는다.

  1. 프로그램이 실행되면 문자열을 입력받는다.
  2. 문자열에서 2번 이상 반복된 같은 문자 혹은 문자열를 찾는다.
  3. M = (반복문자열의 문자수) X (반복수) 이며 M이 최대가 되는 반복문자열을 찾는다.
  4. M이 같다면 반복횟수가 더 많은 반복문자열을 출력한다.
  5. M이 같고 반복횟수가 동일하다면 앞에 나온 문자열을 출력한다.
  6. 만약 반복되는 문자열이 없다면 NULL을 출력한다.
  7. 입력되는 문자는 a~z, A~Z, 0~9 까지로 제한한다.
  8. 만약 유효하지 않은 문자나 빈문자가 입력된다면 프로그램을 종료한다.
  9. 표준 입출력만 이용해야하며 차후 커맨드라인으로 파이프라인을 써서 입출력을 할 수도 있어야한다. (예를 들어, test.exe < input.txt > output.txt 이렇게 사용가능해야함)
  10. 출력형식은 예제출력값의 형식과 동일해야한다.
  11. 입력되는 문자열의 길이는 100만개 이하라고 가정한다.

이러한 문제가 나오고 여기 조건에 맞도록 프로그램을 짜는 것이다. 예제 입력값과 예제 출력값도 나와있다.

예제 입력값 중에 기억나는 것 몇개.

  • 입력 – abcde 출력 – NULL
  • 입력 – 12aaaaaa 출력 – a:6
  • 입력 – ab12ab12abab1212 출력 – ab12:3

위 경우처럼 나와야한다. ‘반복문자열:반복횟수’ 식으로 나와야한다는 것이다.

채점은 프로그램은 일단 작동이 정상적으로 되어야하며 문제 조건에 맞는 수는 모두 처리 가능해야한다. 그리고 프로그램의 실행속도가 빠를수록 높은 점수를 받으며, 코드스타일, 알고리즘, 적절한 자료구조를 썼는가도 평가 대상이 된다.

내가 다섯시간 동안 풀어본 결과…

풀만했다. 아니, 결론은 풀 수 있다. 신입 수준에서 많이 어려운 것 같긴하다. 난 C++로 했고(사실 난 C++ 코드에다가 C 코드를 같이 섞어쓰는 버릇이 좀 있지만.) 거의 세시간 반정도 지나자 위 조건을 만족시키는 코드를 거의 다 짰다. 적절한 자료구조와 알고리즘을 쓰진 않은 것 같다. 사실 그런걸 고려할 수가 없었다. 이걸 다 풀 수 있을까?도 모르겠었고 일단 어떻게든 푸는게 더 중요했다. 어려운 알고리즘 없이 대상 문자열에 전수조사를 해가며 정답을 구하는 방법으로 했다. 지하철 타며 집에 오며 다시 생각해보니 적당한 자료구조(해쉬테이블 같은…)를 썼다면 좀더 좋지 않았을까 싶다. for문과 if문 그리고 간단한 함수 정도로 문제를 풀었다. 딱히 탐색알고리즘 같은것 없이 무차별로 검사하다보니 속도는 딱히 좋지 않은 것 같아서 아쉽다.

여튼 exe 파일형태로 작동했을 때 기대하던대로 잘 작동했고 예제 입출력과도 동일하게 작동했다. 그런데 문제는…. 검증프로그램으로 돌려보니 검증프로그램이 잘 작동하다가 멍 때린다. ㅡㅡ;; 왜 이럴까…하고 고민해보니 연속으로 입력을 받기 위해 while 루프 안에 코드를 작성했는데 데이터가 없는 경우(즉, 빈문자열인 경우) 처리가 안되던 것이다. 테스트해보니 내가 예상하던 부분이 문제가 맞았다. C++에서 엔터키나 빈데이터를 어떻게 처리했었지? 하고 기억해보니 기억이 안난다. ㅠㅠ 으악… 문제를 다 풀었는데 표준입출력이 안되서 한시간반을 매달렸다. 당최 이게 기억이 안나서 별의 별 코드(C++, C는 물론이고 심지어 MFC 문법까지도…쿨럭)를 다 만들어봤지만 결국에 이 부분을 못 만들었다. 정말 정말 아쉬웠다. 하필 내가 들고간 C++ 책에는 이 문제를 해결하는 방법이 없었다. 휴… 책을 골라도 하필 이상한 책을 골라왔나보다. 예전에 C 할때 이 처리 많이해었는데 하필 오늘은 기억이 안나는거다. 이 돌머리 ㅠㅠ

이런 문제를 문자열 패턴처리라고 하는 것 같은데 사실 이런 부분에 대해 고민해본적이 없어서 처음에는 어렵게 느껴졌다. 사실 유니코드 같은 문자열 인코딩 때문에 애먹은적 밖에 없었다.

여튼 핵심적인 문제해결 부분은 다 풀었고 출력 부분 때문에 제대로 작동하지 않은 것이고… 해당 부분에 간단하게 나마 주석도 달아놨으니 시험 검사하는 분도 이해해줄거라 믿고 한번 기다려봐야겠다.

여튼, 결론은…

처음에 이스트소프트 실기시험이 엄청 어렵다고 하길래 되게 겁먹었는데 해볼만했다. 문제를 보고 덤벼드는걸 좋아하는 분들은 적극 해보라고 권하고 싶다. 문제 해결이 처음에는 굉장히 어려워보이는데 작은 부분부터 혹은 본인이 할 수 있는 부분부터 만들어가며 해결해나가는게 도움이 많이 되는 것 같다. 내 경우에는 잘 기억이 나지 않을 때는 노가다 코드를 짜보고 여기서 일정한 규칙이 발견되면 정리해나가며 효율성을 올리거나 재귀함수로 만드는 등의 작업을 하는 스타일인데 이게 도움이 많이 되었다. 실제 저 문제를 푸는데도 이 방법으로 해결했다. 혹시나 나중에 이스트소프트 실기시험을 보러가는 분들은 알고리즘책을 다시 한번 보고 가는게 좋을 것 같다.

한번 더 실기시험 기회를 얻은 분도 있는것 같던데 혹시나 나도 기회가 된다면 한번 더 도전해보고 싶다. 이번엔 100% 만들어버리겠어!!!!!

 

2012년 9월 21일 추가 :: 결국 실기시험에서 탈락했다는 메일을 받았다. 내 실력을 스스로 평가해볼 수 있는 계기가 되었다. 나중에 혹시 더 해볼 수 있는 기회가 있다면 더 해봐야겠다.

클래스와 구조체의 차이

이 질문은 내가 면접을 보러다니던 당시 받았던 질문들이며 내가 제대로 답하지 못했다고 생각하는 것이다. 이 문제에 대해 더 공부하고 잊지 않기 위해 여기에 써둔다.

Q. 클래스가 무엇인가?
A. 같은 성질을 같은 데이터와 함수들의 집합체이다.
Q. 그럼 구조체 역시도 데이터와 함수를 가질 수 있다. 클래스와 동일하게 구조체로도 만들 수 있는데 왜 클래스를 사용하는가?
A. 클래스는 상속이 가능하지만 구조체는 불가능하다.
Q. 구조체 안에 구조체를 넣을 수 있지 않는가?
A. 그렇다.

이 질문에 난 대답을 제대로 못했다. 생각해보니 구조체와 클래스는 비슷한 점이 많은 것 같은데 정확히 차이점을 찾아본 적이 없었다.

검색엔진 등을 통해 구조체와 클래스의 차이점을 찾아본 결과는 다음과 같다.

  1. 클래스와 구조체는 데이터타입을 생성한다는 점에서 유사하다.
  2. 구조체는 기본접근자가 public인데 클래스의 기본접근자는 private이다.
  3. 구조체는 데이터의 초기화가 불가능하지만 클래스는 데이터의 초기화가 가능하다.
  4. 구조체는 데이터의 value가 복사되지만 클래스는 데이터의 reference가 복사된다. 따라서 클래스는 얕은 복사가 일어나고 구조체는 깊은 복사가 일어난다.
  5. 구조체는 상속해줄 수도 상속 받을 수도 없다.
  6. 구조체를 그럼에도 사용하는 이유는 참조의 낭비를 막을 수 있으며 데이터에 직접 접근하기 때문에 속도가 더 빠르다.
  7. 구조체는 함수의 재정의가 안된다.

제일 중요한 점은 reference/value 복사의 차이가 아닌가 싶다. 이에 대한 설명은 http://rintiantta.blog.me/40114721626 에 가장 잘 나와있다. 이 코드를 보면 이해가 한번에 되는 것 같다.

클래스의 경우에는 어떤 클래스의 타입을 가지는 A객체를 만들고 B라는 객체가 A객체와 동일하게 복사한 다음, A객체의 값을 변경하면 B객체의 값도 변경된다. (reference 즉, 메모리주소가 복사되므로)

구조체의 경우에는 어떤 구조체의 타입을 가지는 A객체를 만들고 B라는 객체가 A객체와 동일하게 복사한 다음, A객체의 값을 변경하면 B객체의 값은 변경되지 않는다. (value, 즉, 값 자체가 복사되므로 B객체의 값은 변경되지 않는다.)

<참고자료>

http://blog.naver.com/fsclub2307?Redirect=Log&logNo=130113830445
http://rintiantta.blog.me/40114721626
http://cafe.naver.com/mbcasp/181

지하철에 개찰구는 왜 들어가는 곳보다 나오는 곳이 더 많을까?

이 질문은 내가 N모 게임회사의 기술면접 때 받았던 질문이다. 당시에는 제대로 대답하지 못했지만 내가 몰랐던 부분을 다시 생각해보고 기억해놓기 위해 오답노트에 써둔다.

Q는 면접관님이 나에게 했던 질문이고 A는 내가 대답한 것이다. (존칭은 생략)

Q. 올 때 지하철을 타고 왔나?
A. 그렇다.
Q. 지하철에 개찰구는 왜 들어가는 곳보다 나오는 곳이 많을까?
A. 원래는 수가 같은게 정상이고 현재는 출퇴근시간, 역특성에 따라 유동적으로 조정한다. 최근에는 하나의 개찰구로 나올 수도 들어갈 수도 있게 되어있다.
Q. 만약 그렇지 않고 일반적인 경우(그러니까 이건 예전 지하철 개찰구를 말한다. 나오는 곳과 들어가는 곳이 고정되어있는 경우)에는 들어가는 곳이 많을까 나오는 곳이 많을까?
A. 지금까지 관찰해본 결과, 나오는 곳이 많았다.
Q. 왜 그럴까?

여기까지였고 더이상 대답하기 어려웠다. 몇가지 힌트를 면접관분이 해주셔서 결국에는 답을 말했지만 어찌됐던 좋은 대답은 하지 못했던 것 같다.

집에 오며 관찰해본 결과 강남역의 경우에도 나오는 개찰구가 들어가는 개찰구보다 더 많았다. 다른 지하철역 몇군데도 그러했고 아마 다른 지하철역의 경우에도 마찬가지일 것이다.

집에 돌아오면서 곰곰히 생각해보고 경제학, 수학에 능한 누나와 대화해본 내가 내린 결론은 이렇다.

현재는 내가 대답한대로 최근에는 하나의 개찰구로 들어가는 것과 나오는 것이 가능하고 인구의 변화, 역특성에 따라 조정하는게 맞다. 그렇게 되어있지 않은 옛날 개찰구 방식이라면 나가는 개찰구가 더 많은데 그 이유는 지하철의 특성 때문이다.

지하철의 경우에는 승객이 타러 들어갈 때에는 입구가 하나이고 승객이 한명씩 들어가도 플랫폼에서 기다리게 되므로 상관이 없지만, 지하철이 역에 도착하여 승객이 내리는 경우에는 한번에 많이 내리게 된다. 그렇기 때문에 나오는 개찰구의 수가 더 적다면 승객은 나오지 못하고 개찰구 앞에서 밀리게 된다. 여기서 중요한 것은 승객이 들어가는 경우에는 한명씩 들어가도 상관이 없지만 내리는 경우에는 ‘한번에 많이’ 내리게 된다는 점이다.

더 생각해보니 이걸 프로그래밍과 연관지어보면 입력과 출력이 동시에 일어날 때 출력은 기다리다가 폭발적으로 일어나고 입력은 천천히 지속적으로 일어나는 경우라고 생각된다. 이런 경우 지하철 플랫폼이 일종의 버퍼 역할을 해준다고 볼 수 있을 것 같다.

위 질문을 받았을 때 이렇게 생각했다면 좋았겠지만 그떈 너무 당황하고 긴장해서 제대로 답하질 못했다. 승객이 내릴 때와 승객이 승차하러 들어갈 때의 차이점마저 설명하지 못했고, 그러니 프로그래밍과 연관지어 생각해볼 수도 없었다.

상당히 재미있는 질문이었다. 일상생활에서 일어나는 일을 별 생각해보지 않고 지냈는데 이 일을 계기로 모든 일을 논리적으로 생각해봐야겠다는 생각이 든다. N사의 면접관님께 감사드리며.