PS

코딩테스트에 대하여...

kimyoungrok 2024. 11. 22. 18:54

1️⃣코딩 테스트의 목적

❓기업에서 개발자 채용 과정에 코딩 테스트를 도입한 이유가 뭘까요?

실제 개발 업무에서는 알고리즘을 직접 사용하기 보다, 외부 라이브러리나 API 등을 사용하는 경우가 많습니다. 그럼에도 기업은 코딩테스트를 요구하기에, 지원자는 실제 역량과는 무관한 테스트라 생각할 수 있습니다.

코딩테스트를 준비하기 전에 앞서, 준비 해야하는 이유에 대해 먼저 알아보겠습니다.

종합적인 문제 해결 능력 검증

코딩 테스트는 제한된 시간 내 주어진 문제를 분석하고, 논리적 사고를 통해 해법을 제시하는 능력에 대한 평가입니다.

이 과정에서 지원자가 사용하는 PL과 자료구조에 대한 이해도를 평가할 수 있습니다.

저비용 고효율 필터링

개발자 면접은 결국 개발자가 보지만, 많은 지원자를 보기에는 비효율적입니다. 많은 지원자들 1차 필터링 하고자 코딩테스트를 진행해 효율적인 채용을 진행합니다.

 

❓ 코딩테스트 난이도 비교 : 신입 VS 경력

코딩테스트는 경력직보다 신입이 더 어렵습니다.

경력직은 이미 업무 경험과 실적을 통해 기본적인 역량이 입증되지만, 신입은 이를 판단할 근거가 없기 때문입니다.


2️⃣ 코딩 테스트 준비

코딩 테스트 문제는 어려워질수록 실무랑 무관해집니다.

그렇다면 어떻게, 어디서, 얼만큼 준비해야 할까요?

🤔 How?

코딩 테스트를 준비하는 여러 유형을 소개하겠습니다.

⚡ 벼락치기

서류 제출 후 남은 기간 동안 코딩 테스트를 준비하는 유형

채용 기간 중 다른 역량에 더 집중할 수 있지만, 짧게 준비하는 만큼 이미 숙달 되어 있어야 하고, 높은 정신력을 요구합니다.

💀 이미 알고리즘과 한 몸

재미로 개인 시간을 내서 기업 코딩 테스트 또는 대회에 참여하는 유형

이 분들은 코딩테스트 준비가 불필요합니다.

🌱 잔디심기

매일 Github에 잔디를 심듯 문제를 풀며 장기적으로 준비하는 유형

현실적으로 접근성이 낮아 많이 선택하는 유형입니다.

단, 이미 풀어본/익숙한 문제에 머물기보다 발전적으로 성장하는 학습을 지향해야 합니다.

 

📍Where?

코딩 테스트 준비를 위해 아래와 같이 목표와 단계 별 적합한 플랫폼을 소개합니다.

  1. 학습 단계 : https://www.codetree.ai/
  2. 유형 별 문제 풀이 : https://www.acmicpc.net/
  3. 국내 코딩 테스트 환경 적응 : https://programmers.co.kr/
  4. 기업 코딩 테스트 준비
    1. 코드트리 코테스프린트 30(Samsung, Kakao, Naver, Hyundai, SK, LG)
    2. 프로그래머스 기출문제 모음(Kakao, PCCP, PCCE, Hyundai 경진대회)
    3. 해외 : https://leetcode.com/problemset/
  5. SQL 문제 풀이 : https://www.hackerrank.com/

 

⚖️ How much?

플랫폼 별로 어떤 난이도의 문제까지 풀 수 있어야 할까요?

  • 백준에서는 Silver I ~ Gold II가 적당합니다. 간혹 Platinum V 문제가 출제되기도 합니다. 등급 뒤에 오는 숫자가 작을수록 난이도가 높습니다. 백준 랭킹 시스템인 solved.ac을 함께 이용하는 것을 권장합니다.
  • 프로그래머스는 LV. 2 ~ 3이 적당합니다. 동일한 난이도여도 체감 난이도 차이가 큰 경향이 있습니다.
  • LeetCode는 Medium ~ Hard가 적당합니다. 간혹 Hard의 비중이 높지 않다는 의견도 있습니다.
💡 신입 코딩테스트 문제는 어렵습니다! All Solve를 하지 못했더라도 실망하지 마세요

3️⃣ Programming Language

💡코딩 테스트를 준비해야 하는데 어떤 언어가 좋을까?

 

코딩 테스트에서는 여러 알고리즘과 자료구조를 적절히 사용해야 하며, 숙련도가 낮은 언어를 사용한다면 구현의 난이도가 상승합니다.

🤷 언어 별 코드 비교

여러 PL에서 공백이 있는 (1)한 줄 입력을 받아 (2)짝수의 합을 구하는 코드를 비교해봅시다.

💡 숫자의 개수가 주어지지 않는 문제로 생각해봅시다.

 

Python

from sys import stdin
input=stdin.readline

print(sum(filter(lambda x: x % 2 == 0, map(int, input().split()))))

C

#include <stdio.h>
#include <stdlib.h>

int main() {
    long long sum = 0;
    int n;
    
    while (scanf("%d", &n) != EOF) {
        if (n % 2 == 0) {
            sum += n;
        }
    }

    printf("%lld\n", sum);
    return 0;
}

 

C++

#include <iostream>

using namespace std;

int main() {
    long long sum = 0;
    int n;
    
    while (cin >> n) {
        if (n % 2 == 0) {
            sum += n;
        }
    }

    cout << sum << endl;
    return 0;
}

Java - for each( Java 5 ~ )

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        long sum = 0;
        for (String num : br.readLine()) {
	        int n = Integer.parseInt(num);
          if (n % 2 == 0) {
              sum += n;
          }
        }
        System.out.println(sum);
    }
}

Java - Stream API ( Java 8 ~ )

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        System.out.println(Arrays.stream(br.readLine().split(" "))
                         .mapToInt(Integer::parseInt)
                         .filter(n -> n % 2 == 0)
                         .sum());
    }
}

 

JavaScript(node.js)

const fs = require('fs');
const input = fs.readFileSync("/dev/stdin").toString().trim().split(" ");
console.log(input
    .map(Number)
    .filter(n => n % 2 === 0)
    .reduce((acc, n) => acc + n, 0));

 

⚠️ PL에 따라 동일한 문제의 정답 코드 길이가 달라지거나, 직관적이지 않을 수 있습니다.

 

 

📌 적절한 언어 선택

코딩 테스트를 위해 언어 선택 기준은 다음과 같습니다.

  1. 기존에 많이 사용하던 언어
  2. 실무에서 사용하게 될 언어

코딩 테스트의 주 목적은 모든 문제를 완벽히 푸는 것이 아니라, 최대한 많은 문제를 해결해 PASS를 받는 것입니다.

언어의 깊은 숙련도보다는, 문제 해결 전략과 알고리즘 학습이 더 중요합니다.

언어마다 제공하는 표준 라이브러리와 문법이 다르므로 언어 선택에 대한 부담을 줄이고 알고리즘 학습에 집중할 필요가 있습니다.

코딩테스트 준비 기간이 짧은 경우에는 익숙한 언어를 사용하는 것이 유리하며,

그렇지 않은 경우 실무 환경에서 사용하는 언어로 연습하는 것을 권장합니다.

⚠️ 특정 언어로만 해결 가능한 문제는 주어지지 않습니다.

4️⃣ Tip

🤔 30분 이상 고민하지 말기

문제를 해결하기 위해 30분 이상 고민했다면 해답을 보는 것이 좋습니다.

이는 문제를 풀기 위한 아이디어 또는 알고리즘을 모르고 있을 가능성이 높기 때문입니다.

해답을 참고해 풀이 아이디어를 완전히 이해하고 자신의 코드로 다시 풀어보세요

 

🛠️ 제출하고 생각하기

문제를 처음 풀 때 완벽하지 않아도 괜찮습니다. 코딩 테스트가 끝나기 전 까지 수정할 기회가 있으니 과감하게 도전하세요.

 

💣  문제를 풀었는데 시간 초과?

문제를 잘못 읽고 풀었거나, 사용한 풀이보다 개선된 방식을 사용해야 하는 경우입니다. 더 빠른 알고리즘 혹은 개선된 입/출력 방식을 떠올려 보세요.

 

🤬 문제를 풀었는데 틀렸다?

일부 테스트 케이스에서 실패했다면 특정 입력 값 또는 논리적 오류를 생각해야 합니다.

🧊 엣지 케이스(Edge Case)

극단적인 입력 또는 경계값에서 발생하는 예외 상황

ex) 오버플로우, 인덱스 에러, 0으로 나누기 등

💡최소값 또는 최대값을 입력할 때 발생하는 오류에 주의하세요.

🌀 코너 케이스(Corner Case)

논리적 오류가 발생하는 상황

ex) 100원 입금, 200원 출금, 남은 잔액은 -100원…?

💡문제를 임의로 해석했거나, 정확히 숙지하지 않은 경우 자주 발생합니다. 문제를 다시 읽고, 조건과 로직을 명확히 정리해보세요.

 

🔎 힌트를 보고 풀었다면 반드시 복습

힌트나 정답을 참고했다면, 문제를 다시 풀어봐야 합니다.

⚠️풀이 방법 뿐 아니라 함수 사용법을 검색한 경우도 복습 대상입니다. ex) 리스트 정렬에 필요한 sort()의 사용법 검색
💡문제 풀이 과정을 자신의 흐름대로 이해하고 작성해보세요.

 

🤖 ⭐AI를 남용하지 마세요!⭐

AI는 좋은 학습 수단입니다. 하지만, AI에 의존한다면 문제 해결을 위해 아이디어를 떠올리는 역량을 기를 수 없습니다. 문제 풀이에 완전히 실패했을 때 사용하는 것을 권장합니다.