0. 해당 글을 쓰게 된 배경

더보기

기존에는 c++을 통해서 코테를 준비하였다.

그러나, SSAFY를 시작하게 되면서 전공자의 경우는 Java로 모든 수업이 진행된다고 하였다.

어차피 Spring framework도 사용하고, 요즘 백엔드 직무 관련해서 많은 기업들에서 Java, node.js, python등으로 많이 보는 경향이 있기에 이참에 코테 언어를 변경해서 공부해야겠다고 마음먹었다.

따라서 코테용 주요 함수등을 정리해보면 나와 같은 상황에 있는 사람들에게 조금이나마 도움이 되지 않을까 싶어 글을 쓰게 되었다.

 

 

1. 필드의 구분

  1. 클래스 변수(static variable)
  2. 인스턴스 변수(instance variable)
  3. 지역 변수(local variable)
class Car {

    static int modelOutput; // 클래스 변수
    String modelName;       // 인스턴스 변수
    
    void method() {
        int something = 10; // 지역 변수
    }
}

 

 

class Field {
    static int classVar = 10; // 클래스 변수 선언
    int instanceVar = 20; // 인스턴스 변수 선언
}

public class FieldEx2 {
    public static void main(String[] args) {

        int var = 30; // 지역 변수 선언
        System.out.println("var = " + var); // 지역 변수 참조

        Field myField1 = new Field(); // 인스턴스 생성
        Field myField2 = new Field(); // 인스턴스 생성

        System.out.println("Field.classVar = " + Field.classVar); // 클래스 변수 참조
        System.out.println("myField1 = " + myField1.classVar);
        System.out.println("myField2.classVar = " + myField2.classVar);

        myField1.classVar = 100; // 클래스 변수의 값을 변경

        System.out.println("Field.classVar = " + Field.classVar); // 클래스 변수 참조
        System.out.println("myField1 = " + myField1.classVar);
        System.out.println("myField2 = " + myField2.classVar);

        myField1.instanceVar = 200;

        System.out.println("myField1 = " + myField1.instanceVar); // 인스턴스 변수 참조
        System.out.println("myField2 = " + myField2.instanceVar);

    }
}

 

2. 메소드의 구분

  1. 클래스 메소드(static method)
  2. 인스턴스 메소드(instance method)
class Method {
    int a = 10, b = 20;
//    static int add() {return a + b;} // 다음과 같이 static 메소드는 메소드 내부에서 인스턴스 변수를 사용할 수 없다.
    int add() {return a + b;}
    static int add(int x, int y) {return x + y;}
}

public class TcpMethod2 {
    public static void main(String[] args) {
        System.out.println("Method.add(20, 30) = " + Method.add(20, 30));
        Method myMethod = new Method();
        System.out.println("myMethod.add() = " + myMethod.add());

    }
}

 

3. 초기화 블록

  1. 명시적 초기화
  2. 생성자를 이용한 초기화
  3. 초기화 블록을 이용한 초기화
    1. 인스턴스 초기화 블록
      1. 인스턴스 초기화 블록은 단순히 중괄호({})만을 사용하여 정의
      2. 인스턴스 초기화 블록은 생성자와 마찬가지로 인스턴스가 생성될 때마다 실행
      3. 인스턴스 초기화 블록이 생성자보다 먼저 실행
      4. 여러 개의 생성자가 있으면 모든 생성자에서 공통으로 수행되어야 할 코드를 인스턴스 초기화 블록에 포함하여 코드의 중복을 막을 수 있다. 
class Car {
    private String modelName;
    private int modelYear;
    private String color;
    private int maxSpeed;
    private int currentSpeed;

    { // 인스턴스 초기화 블록 : 단순히 중괄호({})만을 사용, 인스턴스가 생성될 때마다 실행, 인스턴스 초기화 블록이 생성자보다 먼저 실행
        this.currentSpeed = 0;
    }

    Car() {}

    public Car(String modelName, int modelYear, String color, int maxSpeed) {
        this.modelName = modelName;
        this.modelYear = modelYear;
        this.color = color;
        this.maxSpeed = maxSpeed;
    }

    public int getSpeed() {
        return currentSpeed;
    }
}
public class TcpMethod3 {
    public static void main(String[] args) {
        Car myCar = new Car();
        System.out.println("myCar.getSpeed() = " + myCar.getSpeed());
    }
}

 

 

2. 클래스 초기화 블록:

  1. 인스턴스 초기화 블록에 static 키워드를 추가하여 정의할 수 있다.
  2. 클래스가 처음으로 메모리에 로딩될 때 단 한 번만 실행됩니다.
class InitBlock {
    static int classVar; // 클래스 변수
    int instanceVar; // 인스턴스 변수

    static { // 클래스 초기화 블록을 이용한 초기화
        classVar = 10;
    }
}
public class Member04 {
    public static void main(String[] args) {
        System.out.println("InitBlock.classVar = " + InitBlock.classVar); // 클래스 변수에 접근
    }
}

 

4. 필드의 초기화 순서

  1. 클래스 변수: 기본값 -> 명시적 초기화 -> 클래스 초기화 블록
  2. 인스턴스 변수: 기본값 -> 명시적 초기화 -> 인스턴스 초기화 블록 -> 생성자
class InitBlock {
    static int classVar = 10; // 클래스 변수의 명시적 초기화
    int instanceVar = 10; // 인스턴스 변수의 명시적 초기화

    static { // 클래스 초기화 블록을 이용한 초기화
        classVar = 20;
    }
    { // 인스턴스 초기화 블록을 이용한 초기화
        instanceVar = 20;
    }

    public InitBlock() {
        this.instanceVar = 30; // 생성자를 이용한 초기화
    }
}
public class Member04 {
    public static void main(String[] args) {
        System.out.println("InitBlock.classVar = " + InitBlock.classVar); // 클래스 변수에 접근
        InitBlock myInit = new InitBlock();
        System.out.println("myInit.instanceVar = " + myInit.instanceVar);
    }
}

 

난이도: 골드 3

알고리즘 : 시뮬레이션

 

배열을 90도씩 회전하는 부분에 구현을 어떻게 해야할지 감이 잡히지 않아서 조금 해맸다.

그림으로 이해해보기

 

#include <iostream>
#include <cstring>
using namespace std;

int n, m, k;
int r, c;
int pan[41][41] = {
    0,
};
int sticker[11][11] = {
    0,
};
void findSpace(int L);
void patchSpace(int st_x, int st_y);
void rotation(int L);
void input()
{
    cin >> n >> m >> k;

    for (int i = 0; i < k; i++)
    {
        cin >> r >> c;

        memset(sticker, 0, sizeof(sticker) / sizeof(int));

        for (int j = 0; j < r; j++)
            for (int t = 0; t < c; t++)
                cin >> sticker[j][t];
        findSpace(0);
    }
}

void findSpace(int L)
{
    if (L == 4)
        return;

    for (int i = 0; i <= n - r; i++)
    {
        for (int j = 0; j <= m - c; j++)
        {
            bool endFlag = false;
            for (int t = 0; t < r; t++)
            {
                for (int s = 0; s < c; s++)
                {
                    // 스티커 붙일 자리가 채워진 경우
                    if (sticker[t][s] == 1)
                    {
                        if (sticker[t][s] == pan[i + t][j + s])
                        {
                            endFlag = true;
                            break;
                        }
                    }
                }
                if (endFlag)
                    break;
            }
            if (!endFlag)
            {
                // 스티커를 붙일 수 있다면
                patchSpace(i, j);
                return;
            }
        }
    }

    rotation(L);
}

void patchSpace(int st_x, int st_y)
{
    for (int i = 0; i < r; i++)
        for (int j = 0; j < c; j++)
            if (pan[i + st_x][j + st_y] != 1)
                pan[i + st_x][j + st_y] = sticker[i][j];
}

void rotation(int L)
{
    int tmp[11][11] = {
        0,
    };

    for (int i = 0; i < r; i++)
        for (int j = 0; j < c; j++)
            tmp[i][j] = sticker[i][j];

    memset(sticker, 0, sizeof(sticker) / sizeof(int));
    for (int i = 0; i < r; i++)
        for (int j = 0; j < c; j++)
            sticker[j][r - i - 1] = tmp[i][j];
    swap(r, c);
    findSpace(L + 1);
}

int solution()
{
    int res = 0;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            if (pan[i][j] == 1)
                res++;
    return res;
}
int main(int argc, char const *argv[])
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    input();
    cout << solution();

    return 0;
}

'알고리즘' 카테고리의 다른 글

[백준 15683번] 감시 C++  (0) 2023.12.18
[백준 12100번] 2048 C++  (2) 2023.11.18
백준[17298번] 오큰수 C++  (0) 2023.11.07
백준[2230번] 수 고르기 C++  (0) 2023.11.06
백준[1351번] 무한수열 C++  (0) 2023.11.06

0. 지원 자격

 

1. 지원 절차

 

2. 에세이 작성

SSAFY의 에세이 작성은 매 기수마다 공통질문인 것 같다. 글자수 제한(최대 600자)이 있기 때문에 집약적으로 작성하는 것이 필요하다.

얼마나 본인이 열심히 할 것인지에 대한 의지와 SW 관련 경험과 자신이 SW 개발자가 되기 위해서 어떤 것들을 준비했는지 설명해주면 좋을 것 같다.

에세이를 작성한 이후에는 사전 OT 날짜를 선택하고 해당 날짜에 맞춰서 응시 환경을 미리 준비해보면서 코딩테스트를 대비한다.

3. 코딩 테스트

이후에 코딩테스트 일정과 관련하여 문자가 오고 해당 날짜와 시간에 맞춰서 코딩테스트를 보면 된다.

이후 코딩 테스트 결과가 나왔다.

이후 코딩 테스트에 대한 결과가 나왔다.
SSAFY의 코딩테스트 문제는 2문제로 난이도는 백준 기준 실버1 ~ 실버3 수준이었던 것 같다.

꿀팁: 첫 번째 문제에 대한 일정 테스트 케이스를 통과하지 못할 경우 다음 문제로 넘어가지 못하므로 당황하지 말고 넘어가지 않았을 때에는
코드를 다시 살펴보길 바란다.

문제에 대해 정확히 말을 할 순 없지만, 전공자로써 조금만 알고리즘 관련 문제들을 풀어봤다면 크게 어렵다고는 생각이 들지 않을 것이다.

두 번째 문제는 테스트 케이스를 정확하게 통과했는지 여부는 알 수 없다. 따라서 올솔인지 아닌지는 아무도 모른다.
시간이 남은 지원자들은 보통 주어진 테스트 케이스를 손수 계산해본다고 한다. 나는 몇 개 하다가 숫자가 큰 테스트 케이스는
한 두개 해보고 넘어갔다.

꿀팁: 일반적으로 첫 번째 문제는 넘어가고 두 번째 문제까지 풀어야 합격하는 것 같다. 물론 두 번째 문제는 아무도 정답인지 알 수 없으므로
최소 1솔이라고 생각하고 문제에 임하자.

4. 인터뷰

SW 적성진단을 마친 후에 인터뷰에 참석을 선택할 경우 이후에 인터뷰와 관련한 일정이 담긴 문자가 전송된다.

필자는 12/12 오전 10시로 인터뷰가 잡혔는데, 같이 인터뷰 스터디를 했던 사람들 중에 오전 7시 45분에 잡힌 분들이 3분이 있었고,
한 분은 본인과 날짜와 시간이 같았고, 한 분은 전날 오전 10시였다.

SW 전공자와 비전공자는 날짜를 나누어서 본다.
시간은 오전부터 오후까지 다양하게 존재하는 것 같다.

 

4.1 인터뷰 준비

더보기

SW 적성진단에 대한 결과가 나온 이후, 카카오톡 SSAFY 정보 공유 오픈채팅방에서 면접 스터디 관련 오카를 만들고 서로 모집한다.

 

일반적으로 전공자는 전공자끼리, 비전공자는 비전공자끼리 준비를 하는 것 같다.

 

면접이 크게 다른지는 알 수 없지만, 아무래도 전공자는 비전공자에 비해 SW 관련 경험도 더 풍부할 것이기 때문에 인터뷰때도 이와 관련한 질문이 들어올 수 있기 때문에 그런게 아닐까 혼자 생각해보았다.

 

나의 경우, 같은 지역에 사는 사람들과 대면을 통해 총 6명이서 면접 스터디를 진행하였다. 우연인진 몰라도 모두 전공자들로 이루어지게 되었다.

 

꿀팁: 개인적으로 대면을 통해 스터디를 진행하는 것을 추천한다. 아무래도 비대면이면 열심히 하지 않는 것에 대한 제지도 부족하고, 서로 면접관과 면접자 입장에서 모의면접도 진행해보고 사람들을 직접 보고 준비하는 건 확실히 차이가 크다고 생각한다.

나 같은 경우 대면으로 면접 스터디를 진행해서 많은 도움이 되었던 것 같다.

나또한 낯을 많이 가리지만, 이러한 것들로 인해 혼자 준비하거나 비대면으로 하는 것보단 꾹 참고 대면으로 가자. 적극 추천‼️

(나중에 불합격해서 후회하는 것보단 나으니깐?)

 

대면 스터디 진행 방식 - 그 날 진행했던 스터디는 노션을 통해 저장한다.

1. 에세이 작성

- 각자 자신이 작성했던 에세이를 올리고, 한 사람당 2개정도 에세이와 관련한 예상 질문을 올려준다. => 해당 에세이를 작성한 사람은 해당 질문들에 답변들을 작성하면서 준비해본다.

2. 1분 자기소개서 작성

- 각자 1분 자기소개서를 작성한다. (1분에 맞는지 체크해보자!)

-> 작성한 내용에 대해 나올만한 예상 질문을 올려준다. -> 해당 자기소개서를 작성한 사람은 질문에 대한 답변을 작성해보면서 준비해본다.

-> 작성한 자기소개서에서 수정할 부분(문장이 너무 길다, 통일성 등 자신이 면접관 입장일 때 이러한 점이 부족하다는 comment를 작성해준다) -> 자기소개서를 작성한 사람은 해당 comment를 참고하여 수정한다.

 

3. 인성 면접 준비

인터넷에서 구글링해보면 인성 면접과 관련한 질문 리스트들이 다양하게 나온다. 그러한 부분들을 스크랩해서 서로 공유한다.

-> 각자 인성 면접에 어떻게 대답할지 생각해본다.

4. PT 면접 준비

꿀팁:

1. 가능한 많은 IT 주제를 공부해보자.

2. PT 발표 전략을 세우면 좋다.(관련 내용은 유튜브나 많은 블로그에서 동일한 내용들을 소개하므로 나의 글에선 재탕하지 않겠다.)

 

PT 모의 면접 진행방식

1. 각자 매일 하루에 한 개씩 IT 주제와 관련한 기사나 칼럼을 찾아온다.

2. 랜덤으로 기사를 돌려서 각자 한 개의 기사를 시간을 정해서 분석 및 발표 준비를 한다.

3. 5분 동안 각자 발표를 진행한다.

4. 발표 이후 해당 발표자에게 부족했던 부분들에 대해 피드백을 남겨준다.

우리 면접 스터디에서 진행하였던 IT 주제

  1. 인공지능/생성형 인공지능
  2. 블록체인
  3. 빅데이터
  4. OTT
  5. 핀테크
  6. VR/AR/XR/메타버스
  7. IOT
  8. 자율주행
  9. 마이데이터
  10. 딥페이크
  11. 클라우드

이외에도 많은 IT 주제가 많으므로 본인이 부족하다고 생각하면 더 찾아보자. 

 

스터디 진행방식(OneToMany)

1. 면접자 1분 자기소개 -> 나머지 자기소개와 관련한 질문 2개

2. 면접자를 제외한 면접관 입장에서 인성질문과 에세이 관련 질문 2가지 하기 -> 면접자 해당 질문에 대답하기

3. 면접자에 대한 feedback

4. 타이머를 통해 각자 PT 발표 준비

5. 각자 한 명씩 PT 발표(시간 재주기)

6. PT 면접 발표 feedback

 

5. 결과

결과 발표 : 12/21(목) 오후 3시 발표



오랫동안 기다렸던 인터뷰에 대한 결과가 나왔다...

사실 면접을 진행했을 당시 기분좋게 봤다고 생각했기 때문에 초반엔 걱정을 하지 않았지만, 면접은 까봐야 안다는 말을 듣고 긴장을 많이 했었다.

또한 면접 결과가 일주일 내외로 나올 것이라고 생각했으나, 결과가 나오는데 오래 걸렸다.

다행히 내가 원했던 1지망에 합격하게 되었다.

같이 스터디를 진행했던 사람들 6명 가운데 나포함 3명은 본인이 원하는 1지망에 합격하였고,
2분은 지역이 광주와 대전으로 팅기셨다고 한다.
한 분은 아쉽게 불합격하셨다.

그래도 이후에 추가합격으로 많이 돈다고 얘기를 들어서 위로를 해드렸다.
지역이 팅기신 분들은 지역이 바뀌지는 않으므로 입과를 할지 말지 많이 고민하시는 것 같다.
부디 모두 좋은 선택과 좋은 결과가 들려왔으면 좋겠다.

 

 

SSAFY 11기를 합격함으로써 신한투자증권 프로 아카데미 3기 입과는 취소하였다.

앞으로 SSAFY에서 열심히 공부해서 원하는 기업에 취뽀하고 싶다 ‼️

 

 

0. 과정

난이도 : 골드 4
풀이 방법 : DFS + BackTracking
해설:
기존에는 backtracking을 위해서 move에서 이동했던 것 만큼 다시 되돌려주었는데 
6 6
1 0 0 0 0 0
0 1 0 0 0 0
0 0 1 5 0 0
0 0 5 1 0 0
0 0 0 0 1 0
0 0 0 0 0 1
답 : 2

다음 input값에서 무한루프가 돌았다. 따라서 다른 사람들의 풀이를 참고하니 굳이 moveBackTracking()를 통해 되돌려주는 대신 tmp 배열을 이용해 기존 방문했던 visited 배열을 저장했다가 다시 되돌려주는 방식을 이용하였다.

 

1. 첫 번째 풀이

#include <iostream>
#include <climits>
#include <vector>
using namespace std;

int n, m;
int pan[9][9];
int visited[9][9] = {
    0,
};
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};

vector<pair<int, int>> cctv;

int res = INT_MAX;

void input()
{
    cin >> n >> m;

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            cin >> pan[i][j];

            if (pan[i][j] != 0 && pan[i][j] != 6)
            {
                cctv.push_back({i, j});
            }
            if (pan[i][j] != 0)
            {
                visited[i][j]++;
            }
        }
    }
}

void move(int x, int y, int dir)
{
    while (true)
    {
        int nx = x + dx[dir];
        int ny = y + dy[dir];

        if (nx >= 0 && nx < n && ny >= 0 && ny < m && pan[nx][ny] != 6)
        {
            visited[nx][ny]++;
            x = nx;
            y = ny;
        }
        else
        {
            break;
        }
    }
}

void moveBackTracking(int x, int y, int dir)
{
    while (true)
    {
        int nx = x + dx[dir];
        int ny = y + dy[dir];

        if (nx >= 0 && nx < n && ny >= 0 && ny < m && pan[nx][ny] != 6)
        {
            visited[nx][ny]--;
            x = nx;
            y = ny;
        }
        else
        {
            break;
        }
    }
}

void DFS(int L)
{

    if (L == cctv.size())
    {
        int ans = 0;
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
                if (!visited[i][j])
                {
                    ans++;
                }
            }
        }

        res = min(res, ans);

        return;
    }

    for (int i = L; i < cctv.size(); i++)
    {
        int x = cctv[i].first;
        int y = cctv[i].second;

        if (pan[x][y] == 1)
        {
            for (int j = 0; j < 4; j++)
            {
                move(x, y, j);
                DFS(L + 1);
                moveBackTracking(x, y, j);
            }
        }
        else if (pan[x][y] == 2)
        {
            // 상하
            move(x, y, 0);
            move(x, y, 1);
            DFS(L + 1);
            moveBackTracking(x, y, 0);
            moveBackTracking(x, y, 1);

            // 좌우
            move(x, y, 2);
            move(x, y, 3);
            DFS(L + 1);
            moveBackTracking(x, y, 2);
            moveBackTracking(x, y, 3);
        }
        else if (pan[x][y] == 3)
        {
            // 상
            move(x, y, 0);
            for (int j = 2; j < 4; j++)
            {
                move(x, y, j);
                DFS(L + 1);
                moveBackTracking(x, y, j);
            }
            moveBackTracking(x, y, 0);

            // 하
            move(x, y, 1);
            for (int j = 2; j < 4; j++)
            {
                move(x, y, j);
                DFS(L + 1);
                moveBackTracking(x, y, j);
            }
            moveBackTracking(x, y, 1);
        }
        else if (pan[x][y] == 4)
        {
            for (int j = 0; j < 4; j++)
            {
                move(x, y, j);
            }
            for (int j = 0; j < 4; j++)
            {
                moveBackTracking(x, y, j);
                DFS(L + 1);
                move(x, y, j);
            }
            for (int j = 0; j < 4; j++)
            {
                moveBackTracking(x, y, j);
            }
        }
        else if (pan[x][y] == 5)
        {
            for (int j = 0; j < 4; j++)
            {
                move(x, y, j);
            }
            DFS(L + 1);
            for (int j = 0; j < 4; j++)
            {
                moveBackTracking(x, y, j);
            }
        }
    }
}

int main(int argc, char const *argv[])
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    input();
    DFS(0);

    cout << res;

    return 0;
}

2. 정답 풀이

#include <iostream>
#include <climits>
#include <vector>
using namespace std;

int dx[] = {-1, 0, 1, 0}; // 상,우,하,좌
int dy[] = {0, 1, 0, -1};
int n, m; // 세로, 가로
int pan[9][9];
int visited[9][9] = {
    0,
};
vector<pair<int, int>> cctv;
int res = INT_MAX;

void input()
{
    cin >> n >> m;

    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
        {
            cin >> pan[i][j];

            if (pan[i][j] != 0)
            {
                visited[i][j] += 1;
                if (pan[i][j] != 6)
                    cctv.push_back({i, j});
            }
        }
}

void move(int x, int y, int dir)
{
    dir %= 4;
    while (true)
    {
        int nx = x + dx[dir];
        int ny = y + dy[dir];

        if (nx >= 0 && nx < n && ny >= 0 && ny < m && pan[nx][ny] != 6)
        {
            visited[nx][ny] += 1;
            x = nx;
            y = ny;
        }
        else
            break;
    }
}

void DFS(int L)
{
    if (L == cctv.size())
    {
        int ans = 0;
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                if (visited[i][j] == 0)
                    ans++;
        res = min(res, ans);

        return;
    }

    int tmp[9][9];
    for (int k = 0; k < 4; k++)
    {

        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                tmp[i][j] = visited[i][j];

        int x = cctv[L].first;
        int y = cctv[L].second;

        if (pan[x][y] == 1)
        {
            move(x, y, k);
        }
        else if (pan[x][y] == 2)
        {
            move(x, y, k);
            move(x, y, k + 2);
        }
        else if (pan[x][y] == 3)
        {
            move(x, y, k);
            move(x, y, k + 1);
        }
        else if (pan[x][y] == 4)
        {
            move(x, y, k);
            move(x, y, k + 1);
            move(x, y, k + 2);
        }
        else if (pan[x][y] == 5)
        {
            move(x, y, k);
            move(x, y, k + 1);
            move(x, y, k + 2);
            move(x, y, k + 3);
        }

        DFS(L + 1);

        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                visited[i][j] = tmp[i][j];
    }
}
int main(int argc, char const *argv[])
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    input();
    DFS(0);
    cout << res;

    return 0;
}

 

'알고리즘' 카테고리의 다른 글

[백준 18808 번] 스티커 붙이기 C++  (0) 2023.12.25
[백준 12100번] 2048 C++  (2) 2023.11.18
백준[17298번] 오큰수 C++  (0) 2023.11.07
백준[2230번] 수 고르기 C++  (0) 2023.11.06
백준[1351번] 무한수열 C++  (0) 2023.11.06

0. 공고

 


1. 서류전형

더보기

우선 서류 전형으로 기본적인 개인정보를 입력하고,

자소서 문항을 작성하면 된다.

 

총 3가지 질문이고 작성 내용이 부족하면 4번에서 추가로 작성가능하였다.

 

1. 디지털/ICT분야에서 어떤 인재로 성장하고 싶은지 향후 계획 및 포부를 작성해주세요.

 

2. 디지털/ICT역량을 갖추기 위하여 노력한 활동(공모전, 프로젝트, 인턴, 개인공부 등)에 대해 구체적으로 작성해주세요. [활동 전반에 대한 구체적인 과정 및 결과, 본인의 수행역할 등]

 

3. 신한투자증권이 본인을 선발해야 하는 이유를 작성해주세요.

 

4. 선택사항(상기 항목에서 기재하지 못한 내용 및 기타 사항을 자유롭게 작성해주세요.)

 

전반적으로 기존에 작성하던 자소서 문항에서 금융과 관련하여 작성하였다.
자세한 내용은 면접 부분에서 더 얘기하겠다.

 


 

2. 코딩테스트

 

더보기

서류를 통과하면 다음과 같이, 코딩테스트 관련 메일이 날라온다.

코테는 엘리스에서 진행되고 총 3문제로 구성되었다.

 

난이도는 쉬웠다.(백준 기준 실버정도?)

1시간에 3문제를 푸는 방식이었는데, 나같은 경우 3문제를 풀고 20분정도 남았고, 문제를 풀때마다 테스트를 실행하여 모든 문제가 100점 나오는 것을 확인하고 중간에 퇴실하였다.

 

문제의 유형은 내가 푼 방식으로는 완전탐색, DFS, Union-Find를 이용하여 해결하였다.

 

신기한점은 해당 날짜에 12시부터 6시까지 중에 한시간만 시간을 내어 푸는 방식이었다.

당시, 카카오 코테가 2시부터 7시였기 때문에 12시부터 바로 시험을 봤다.

 


3. 면접

더보기

이후 코딩테스트 결과가 나왔다.

3문제를 모두 풀었기 때문에 크게 걱정하진 않았던 것 같다.

오픈톡방을 보니 비전공자와 전공자가 함께 있다보니 솔이 다양했는데, 대체로 2솔~3솔이 많았던 것 같고,

1솔을 푼 사람 중에서도 코테를 합격했다고 말하는 걸 보니 기준이 크게 중요하진 않았던 듯?

 

이후 면접에 참여하였고, 면접자들의 복장을 보니 70프로정도가 정장, 나머지는 깔끔하게 캐주얼로 입었던 것 같다.

필자도 캐주얼로 입었다.

 

사실 다른 면접을 준비하느라 프로 아카데미는 거의 준비를 하지 않았다.

 

면접의 진행 과정은 혹시 모를 대외비를 위해 자세하게 설명하진 않겠다.

면접을 진행하는 과정에서 공통 질문 있었다.

그 외에는 면접관들이 크게 면접자들의 관심이 없는 것으로 보였고, 매우 딱딱한 분위기였다.

그나마 자소서 작성했던 부분에서 특이한 부분에 대해서는 질문을 하는 것 같다.

 

또한 내가 자소서 작성 내용중에 금융과 관련된 부분을 많이 썼는데, 이부분은 매우 마이너스였다.

금융 도메인과 증권 도메인은 매우 다른데, 이부분을 잘 알지 못하고 작성하였고, 잘 얘기하지 못하였다.

(개인적인 생각으로 아무래도 신한투자증권에서 직접 교육하는 것이 아니어서 그런지... 여기까지... 궁금하신게 있다면 댓글로 남겨주세요 ㅋㅋ)

 

무튼 면접은 매우 못봤다.

 


4. 결과

더보기

면접 결과는 예비를 받았다.

사실 면접을 하도 망쳐서 기대를 하지 않았는데

예비를 받은거보면 단순하게 면접만 영향을 받는 것은 아니라고 생각하였다.

 

당시 문자를 받았을 때, 사람들마다 문자가 오는 시간이 제각각이었고(편차 최대 1시간), 어떤 사람은 불합격문자를 받고 예비를 그뒤로 받았고,

어떤 사람은 예비를 받고 이후 합격문자가 바로 날라오는 등, 전산상에서도 문제가 있는 것처럼 보였고, 다른 분이 문의를 드렸는데 오류라고 한다. -> 다들 수작업으로 문자를 보내는 것은 아닌지 의문이 들었다..

 

아무튼 실제 면접이라는 것을 본건 처음이었는데, 좋은 경험이었다.

 

곧 다른 부캠들도 결과가 나오면서 예비가 돌며, 아마 나한테도 입과할 것인지 연락이 올 것 같지만, 싸피와 함께 지원한 상태이고, 싸피가 되길 간절히 기도하는 중이다.

 

이상 신한투자증권 프로 아카데미 후기였다.

궁금한 점은 댓글 주면 상세하게까진 아니더라도 얘기주도록 하겠다.

 

이후에 합격 전화가 왔고, 입과여부를 여쭤보셨다. 우선 기다리는 것이 있어서 입과를 하겠다고 얘기하였고, 합격 문자가 왔다. 추가로 이후 입과를 위한 kdt training 관련 문자가 왔다.
그러나, SSAFY 11기에 합격하였고, 신한투자증권 프로 아카데미에 전화하여 입과 포기를 말씀드렸다.

+ Recent posts