2022 스마일게이트 직무체험 인턴십에 지원한 후기를 남겨보려 한다.

누군가한테 도움이 될 수도 있으니.

나는 프로그래머라서 개발 직군으로 지원했다.

 

1. 서류

서류 제출하고 코테는 안본다.

서류 제출하고 결과만 기다리면 된다.

 

2. PT 과제

서류 합격하면 면접 전에 PT 과제를 제출한다.

제출한 과제물로 면접 때 발표하는 형식이다.

내가 만든 게임 동영상을 제출했다.

 

3. 면접

면접은 온라인으로 진행했다.

면접 시간은 30분정도 본 것 같고 3(면접관):1 면접이었다.

PT 과제 발표하고 질문하고 그런 시간을 가졌다.

면접관분들 다 좋으셨고 긴장 안하고 재밌게 진행했다.

면접 끝나고 집에 사무용품을 택배로 보내주셨다.

감사합니당.

 

4. 최종 발표

최종 발표는 전체 면접 일정이 끝나고 일주일안에 나왔다.

결과는...

합격했다.

대박.

일정 공지나 결과 공지 같은 것은 모두 개인 메일로 온다.

면접 기간동안 메일함을 몇번을 확인했는지 모르겠다.

아무튼 뽑아주셔서 감사합니다.

'History' 카테고리의 다른 글

2022 엔씨소프트 여름 인턴십 지원 후기  (2) 2022.06.29
2022 넷마블 여름 인턴십 지원 후기  (0) 2022.06.29

2022 엔씨소프트 여름 인턴십에 지원한 후기를 남겨보려 한다.

누군가한테 도움이 될 수도 있으니.

프로그래머도 지원할 수 있는 직군이 다양했다.

그래픽스를 하고 싶어서 그 중에서 게임 엔진개발에 지원했다.

 

1. 서류 + 코딩테스트

1단계는 서류를 제출하고 코테를 본다.

코테는 서류 제출한 사람은 모두 보는 것 같다.

코테는 대학교 비대면 시험처럼 각자 집에서 캠켜고 보는 방식이었다.

총 시험 시간이 애석하게도 기억이 안난다.

근데 시간은 엄청 충분했고 문제가 그렇게 어렵지 않았다.

문제 다 풀면 먼저 나가도 돼서 많이들 먼저 나갔을 듯 하다.

 

2. NC TEST

2단계는 NC TEST인데 인성 검사 같은 거 였고 온라인으로 진행했다.

MBTI 검사 느낌인데 300문제가 넘는다.

따로 준비할 필요는 없을 것 같다.

 

3. 면접

면접은 온라인으로 진행했다.

NC는 특이했던게 나를 면접을 보고 싶은 팀들이 면접을 신청하고 팀 별로 면접을 보는 방식이었다.

나는 2개의 팀과 면접을 봤다.

뭔가 온라인으로 면접을 보니 대면으로 하는 것보다 덜 떨리는 것 같았다.

면접 시간은 팀 별로 다르고 손코딩을 하는 팀도 있었다.

면접관님들 모두 좋으시고 재밌게 본 것 같다.

아 그리고 면접 보기 전에 면접키트를 택배로 보내주셨다.

이게 대기업인가..

 

4. 최종 발표

최종 발표는 전체 면접 일정이 끝나고 일주일안에 나왔다.

결과는...

합격했다.

대박.

그래픽스 할 생각에 설렌다.

뽑아주셔서 감사합니다.

2022 넷마블 여름 인턴십에 지원한 후기를 남겨보려 한다.

누군가한테 도움이 될 수도 있으니.

나는 프로그래머라서 소프트웨어 개발 직군으로 지원했다.

 

1. 서류 + 코딩 테스트

1단계는 서류를 제출하고 코테를 본다.

코테는 서류 제출한 사람은 모두 보는 것 같다.

코테는 대학교 비대면 시험 처럼 각자 집에서 캠켜고 보는 방식이었다.

총 시험 시간은 4시간 이었는데 중간에 다 풀면 먼저 나가도 된다.

문제가 그렇게 어렵지 않아서 아마 다들 1~2시간 풀고 나갔을 듯 하다.

 

2. 인성 검사

2단계는 인성 검사인데 이것도 온라인으로 진행했다.

MBTI 검사 느낌인데 300문제가 넘는다.

따로 준비할 필요는 없을 것 같다.

 

3. 면접

면접은 넷마블 본사에서 대면으로 진행했다.

생각했던 것보다 넷마블 회사 건물이 크고 좋아서 놀랐다.

3(면접관):1 면접이었고 50분 정도 본 것 같다.

면접전에 미리 도착해 대기하고 있었는데, 그곳에 있었던 넷마블 직원분들이 굉장히 친절하고 면접자들 긴장 풀어주시려고 말도 걸어주신다.

넷마블이 좋은 회사인만큼 좋은 사람들이 있구나라고 느꼈다.

면접관분들도 좋으시고 면접 들어갈 때는 긴장됐는데 오히려 말하다 보니 긴장이 다 풀렸다.

아무튼 면접 끝나면 교통비도 주시고 사내 카페 이용권도 주시고 선물 키트도 주셨다.

 

4. 최종 발표

최종 발표는 전체 면접 일정이 끝나고 일주일안에 나왔다.

결과는...

합격했다.

대박.

일정 공지나 결과 공지 같은 것은 모두 개인 메일로 온다.

면접 기간동안 메일함을 몇번을 확인했는지 모르겠다.

아무튼 뽑아주셔서 감사합니다.

#include <ssteram>
using namespace std;

string str = "find new";
stringstream in(str);
string a, b;
in >> a >> b;

// a = "find"
// b = "new"

활용시 참고

https://life-with-coding.tistory.com/403

 

[C++] stringstream 사용법

인트로 안녕하세요. 오늘은 C++의 Stringstream 사용법에 대해 포스팅하겠습니다. C++에서 여러가지 자료형이 한 줄에 들어오면 파싱해서 용도에 맞게 사용할 필요가 있는데요. 특히 "이름 날짜 내용"

life-with-coding.tistory.com

 

https://notepad96.tistory.com/57

 

C++ min, max 함수

1. min, max, minmax min, max, minmax는 algorithm 라이브러리의 구현되어 있는 함수이다. 각 함수들은 두 값을 비교하여 더 작은 값, 더 큰 값을 반환해 준다. 위 함수는보통 2개의 값만 비교하여 최대값, 최

notepad96.tistory.com

https://notepad96.tistory.com/40

 

C++ Vector 최대값, 최소값, 인덱스 구하기

1. 최대값, 최소값 vector 컨테이너에서 최대값, 최소값을 구할 경우 for문을 작성할 수도 있지만 이는 복잡하다. 그래서 algorithm 라이브러리의 있는 max_element를 사용한다면 한줄로도 간단하게 최대

notepad96.tistory.com

 

#include <stirng>

int a = std::stoi("1");        // string to int
int b = '7' - '0';             // char   to int
string c = std::to_string(3);  // int    to string
char ch = (char)(9 + 48);      // int    to char

ASCII 코드에서 숫자 0은 48부터 시작하기 때문

#include <vector>
#include <unordered_map>
#include <algorithm>
#include <iostream>
using namespace std;

bool cmp(pair<string, int>& a, pair<string, int>& b)
{
    return a.second < b.second;
}

int main()
{
    unordered_map<string, int> map;

    map["a"] = 6;
    map["b"] = 1;
    map["c"] = 4;
    map["d"] = 8;

    vector<pair<string, int>> vec(map.begin(), map.end()); // map을 vector로 변경
    sort(vec.begin(), vec.end(), cmp);

    for (auto elem : vec)
    {
        cout << elem.first << endl;
    }
}

출력 결과

b
c
a
d
C++를 언어들의 연합체로 바라보는 안목은 필수

▶ C

  • C++은 C를 기본으로 함

▶ 객체 지향 개념의 C+

  • 'C with Classes'에 관한 모든 것
  • 클래스(Class), 캡슐화(Encapsulation), 상속(Inheritance), 다형성(Polymorphism). 가상 함수(Virtual function)
    • 정적 바인딩: 컴파일시에 메모리를 할당 >> 일반 함수, 일반 변수 할당
    • 동적 바인딩: 런타임시에 메모리를 할당 >> 가상 함수, 변수 동적 할당
  • https://simsimjae.tistory.com/293

▶ 템플릿 C++

  • C++ 일반화 프로그래밍(Generic programming)의 일부

▶ STL

  • Standard Template Library
이것만은 잊지 말자! 
C++를 사용한 효과적인 프로그래밍 규칙은 경우에 따라 달라진다. 그 경우란, 바로 C++의 어떤 부분을 사용하느냐이다.

#define을 쓰려거든 const, enum, inline을 떠올리자

▶ #define

#define ASPECT_RATIO 1.653
  • 컴파일 전에 선행 처리자(Preprocessor)가 ASPECT_RATIO를 찾아 1.653으로 치환함
  • 따라서 컴파일러는 이것이 ASPECT_RATIO라는 것을 알 수 없음
  • 디버깅에 혼란이 올 수 있음

▶ const

const double AspectRatio = 1.653;
  • 위 문제의 해결법은 매크로 대신 상수를 쓰는 것

▶ #define을 상수로 교체할 때 주의점

  • 상수 포인터(constant pointer) 정의
    • 상수 정의는 대게 헤더 파일에 넣어 다른 파일들이 include해서 사용
    • 포인터는 const로 선언하고, 포인터가 가리키는 대상까지 const로 선언
const char* const authorName = "Scott Meyers";
  • 클래스 상수 정의
    • 클래스 상수의 사본 개수가 1개를 넘지 못하게 하고 싶다면 정적(static) 멤버로 선언
    • #define과 달리 클래스 상수는 캡슐화 혜택을 받을 수 있음
    • 오래된 컴파일러는 아래 문법을 받아들이지 못하는 경우가 있으므로, 초기값을 상수 정의시 지정
class GamePlayer{
private:
   static const int NumTurns = 5;   // 클래스 상수 선언과 동시에 초기화
}
// 오래된 컴파일러
class GamePlayer{
private:
   static const int NumTurns;        // 정적 클래스 상수 선언, 헤더파일
}

const int GamePlayer::NumTurns = 5;  // 정적 클래스 상수 정의, 구현 파일

▶ enum

  • 컴파일러가 구식인데 클래스를 컴파일하는 도중에 클래스 상수가 필요할 때 사용
  • 'enum hack' 기법
  • #define처럼 주소를 얻어갈 수 없음
class GamePlayer {
private:
   enum { NumTurns = 5 };
   int scores[NumTurns];
}

 

 

▶ 매크로 함수

  • #define을 이용한 매크로 함수는 단점이 많음
  • 아래의 경우 비교를 통해 처리한 결과에 따라 a가 증가하는 횟수가 달라짐
#define CALL_WITH_MAX(a, b) f((a) > (b) ? (a) : (b))

int a= 5, b = 0;
CALL_WITH_MAX(++a, b);      // a가 두 번 증가
CALL_WITH_MAX(++a, b+10);   // a가 한 번 증가
  • CALL_WITH_MAX(++x, y) → ((++x) > (y) ? (++x) : (y)): 비교할 때 1번, return 할 때 1번 총 2번 증가
  • CALL_WITH_MAX(++x, y + 10) ((++x) > (y + 10) ? (++x) : (y + 10)): 비교할 때 1번 증가

▶ inline

  • 매크로 함수의 문제점에 대한 해결법
  • 일반적인 함수 호출 과정을 거치지 않고, 함수의 모든 코드를 호출된 자리에 바로 삽입하는 방식
  • 함수를 호출하데 걸리는 시간이 절약됨
template<typename T>
inline void callWithMax(const T& a, const T& b)
{
   f(a > b ? a : b);
}
이것만은 잊지 말자! 
단순한 상수를 쓸 때는, #define보다 const 객체 혹은 enum을 우선 생각하자
함수처럼 쓰이는 매크로를 만들려면, #define 매크로보다 인라인 함수를 우선 생각하자

낌새만 보이면 const를 들이대 보자!
  • 값을 바꾸면 안된다면 명시적으로 const를 사용
char greeting[] = "Hello";
const char *p = greeting;   // 비상수 포인터, 상수 데이터
char * const p = greeting;  // 상수 포인터, 비상수 데이터
  • 아래 두 코드는 완전히 동일
void f1(const Widget *pw);
void f2(Widget const *pw);
  • 선언(declaration)은 코드에 사용 되는 '어떤 대상'의 이름과 타입을 컴파일러에게 알려주는 것 
extern int x;                        // 객체 선언
std::size_t numDigits(int number)    // 함수 선언

extern

  • 외부 참조 지정자
  • 다른 모듈에 존재하는 변수를 전역 변수처럼 사용하기 위해 사용함
  • extern을 이용해 외부 모듈 어딘가 변수나 함수가 선언되어 있다고 정보를 알려줌으로써 컴파일시에 식별자를 찾지 못한다는 에러를 일으키지 않음
  • 링크 과정에서 결정
  • https://thrillfighter.tistory.com/397

▶ std::size_t

  • typedef unsigned int size_t
  • C++에서 개수를 셀 때 주로 사용

  • 정의(definition)은 선언에서 빠진 구체적인 세부사항을 컴파일러에 제공하는 것
int x;                             // 객체 정의
std::size_t numDigits(int number)  // 함수 정의
{
    std::size_t digit = 1;
    return digit;
}
  • 객체의 경우는 컴파일러가 그 객체에 대한 메모리를 마련해 놓은 부분이 정의가 됨

  • 초기화(initialization)는 어떤 객체에 최초의 값을 부여하는 과정
    •   사용자 정의 타입으로 생성된 경우, 초기화는 생성자에 의해 이루어짐
Class Widget {
public:
    Widget();                              // 기본 생성자(defulat constructor)
    Widget(const Widget& rhs);             // 복사 생성자(copy constructor)
    Widget& operator=(const Widget& rhs);  // 복사 대입 연산자(copy assignment operator)
}

Widget w1;                                 // 기본 생성자 호출
Widget w2(w1);                             // 복사 생성자 호출
w1= w2;                                    // 복사 대입 연산자 호출
Widge w3 = w2;                             // 복사 생성자 호출
  • lhs - light hand side / rhs - right hand side
bool hasAcceptableQuality(Widget w);

Widget aWidget;
if (hasAcceptableQuality(aWidget))     // 복사 생성자 호출
  • 함수 호출 시 aWidget는 복사 생성자를 통해 w로 복사됨
  • 즉 'pass-by-value'는 '복사 생성자 호출'

  • 명시적 타입 변환(explicit type casting)은 캐스팅할 type 명시
  • 암시적 타입 변환(implicit type casting)은 캐스팅할 type을 컴파일러가 알아서 지정
// Implicit conversion
int i = 75;
long j = i;

// Explicit conversion
double d = 75.25;
int i = (int)d;
class A
{
public:
    explicit B(int x = 0, bool b = true);  // 기본 생성자(default constructor)
};
  • 클래스의 생성자에선 특별한 경우가 아니면 explicit을 통해 의도치 않은 암시적 변환을 막아주는 것이 좋음

  • 표기법

▶ Camel Case

int helloWorld;
  • 첫 글자는 소문자, 두 번째 단어부터는 첫 글자 대문자
  • Java 프로그래밍에서 권장

Pascal Case

int HelloWorld;
  • 첫 글자와 단어의 첫 글자 대문자
  • Python 프로그래밍에서 권장

▶ Snake Case

int hello_world;
  • 단어 사이를 언더바로 연결

▶ Hungarian Notation

bool bInitialized = false;
int nSize = 2;
Widget* pWidget;

  • 16진수(Hexadecimal)
    • 16진법에서는 숫자 0~9까지와 영문 알파벳 문자 A~F까지를 사용함
    • 16진수는 근대 컴퓨터에 1 byte를 8 bit로 정의되어 있기 때문에 2진수를 표현하는 편리한 방법
    • 한 개의 16진수 숫자는 4개의 2진수 숫자를 표시할 수 있음, 두 개의 16진수 숫자는 8bit, 즉 1 byte를 표현할 수 있음
2진수 10진수 16진수
0 0 0
1 1 1
10 2 2
11 3 3
100 4 4
101 5 5
110 6 6
111 7 7
1000 8 8
1001 9 9
1010 10 A
1011 11 B
1100 12 C
1101 13 D
1110 14 E
1111 15 F
10000 16 10
10001 17 11

 


  • Build 과정
    • Build = Compile + Link
    • Run = Build + 실행

▶ Compile

  • Compile은 High-level language(Python, C)인 소스 코드를 Low-level language(기계어, 어셈블리어)로 번역하는 과정
  • 결과로 목적 파일(.obj)이 생성됨

▶ Link

  • 여러 개의 목적 파일을 합쳐서 하나의 실행 가능한 파일로 만드는 과정
  • 결과로 실행 파일(.exe)이 생성됨
  • Static link: 컴파일된 소스 파일들을 연결해서 최종 실행 가능한 파일을 생성
  • Dynamic link: 프로그램 실행 도중, 프로그램 외부에 존재하는 코드(.dll)를 찾아서 연결, 링커가 필요 없음
  • https://jhnyang.tistory.com/42
  • https://jhnyang.tistory.com/40

 

지난 5개월간 펄어비스 인재양성 프로그램을 진행했다.

 

 

펄어비스에서 3가지 주제를 주었고 그 중 하나를 자유롭게 선택해 5개월 동안 개발하는 형식이었다.

 

<주제>

-Smoothed-particle hydrodynamics (SPH) : 유체 운동 렌더링

-Procedural terrain generation (PTG) + Ecosystem : 절차적 지형 생성

-Urban traffic simulation : 도시 교통 시뮬레이션

 

나는 이중 Urban traffic simulation을 선택했다.

GTA와 같은 도시 교통 시뮬레이션을 구현하는 주제였는데 재밌어보였다.

마침 AR 공부를 하면서 자율주행 쪽 논문도 읽고 있어서 구현해보고 싶었다.

자동차 AI들이 알아서 운전해다니고 서로 상호작용하고 신호등도 있고,, 실시간으로 표지판도 추가하면 이에 반응하고 등등

 

아무튼 결과만 말하자면 나는 내 결과에 매우 만족하지 못했다.

솔직히 말하자면 좀 어려웠다.

처음에는 로직으로 모든 것을 구현해보려 했는데 생각보다 잘 되지 않았다.

자연스러운 자동차의 움직임 그런 것들이 내 마음대로 잘 되지 않았다.

ㅜㅜ

결국에 차선 변경은 강화학습을 해보려고 했는데 그것도 잘 되지 않았고...

그래도 5개월 동안 많이 배웠다.

내 부족한 점도 알 수 있었고 많이 열심히 해야겠다고 느꼈다.

아무튼 좋은 경험이었고 그래도 펄어비스 쪽에서는 결과물보고 만족했다고 하셔서 최종 장학금까지 받을 수 있었다!!

 

아래는 내 프로젝트 영상이다.

다른 학생분과 최종본을 합쳤는데 앞쪽 부분이 내가 한 부분이다.

https://www.youtube.com/watch?v=NVVCE6fNrKw 

 

이건 우리 학과 홈페이지에 올라온 결과 포스트이다.

http://swcon.khu.ac.kr/agora/?vid=554 

 

[펄어비스 × 경희소융] 인재 양성 프로그램 1차 완료안내 및 결과물

안녕하세요^^2022년 1월 31일 최종 발표를 기점으로 [펄어비스 × 경희소융] 인재 양성 프로그램 1차가 마무리되었고 이에 대한 결과물들을 학생들에게 공유하고자 본 글을 씁니다. 2학년부터 4학년

swcon.khu.ac.kr

 

이건 우리 학과 홈페이지에 올라온 다른 학생분이 쓰신 후기인데 글을 나보다 잘쓰셔서 ㅎㅎ

펄어비스 인재양성 프로그램이 궁금하시다면 아래 글을 보시는게 좋을 듯 합니다.

http://swcon.khu.ac.kr/agora/?vid=553 

 

펄어비스 x 소융과 인재 양성 프로그램 후기

안녕하십니까? 학우 여러분들, 설 연휴는 잘 쉬고 계신지요.저는 소프트웨어융합학과 게임콘텐츠 트랙 소속으로 올해 4학년에 올라가는 학생입니다.지난 1/30 마무리 되었던 펄어비스 인재 양성

swcon.khu.ac.kr

 

+ Recent posts