경험의 기록

안녕하세요 😀

안드로이드 앱 개발을 공부하고 있는 한상엽입니다.

취업을 위한 코딩 테스트를 준비할 때

언어에 대한 고민을 하는 글을 종종 보았는데요.

C, C++, Java, Kotlin, Python 으로 문제를 풀어본

제 경험에 기반한 견해에 대해 말씀드리고자 합니다!

 


 

1️⃣ 정말 특정 언어가 코딩 테스트에서 유리한가?

출처 : 이것이 취업을 위한 코딩 테스트다 with 파이썬 (저자 : 나동빈)

통계자료를 살펴보면 많은 사람들이 C++, 파이썬 언어가 유리하다고 생각한다는 것을 알 수 있는데요.

실제로 위 언어는 코딩 테스트에서 장점이 많습니다.

 

파이썬의 최대 장점은 사용하기 쉽고 간결하다는 겁니다.

public class Main {
   public static void main(String args[]) {
     System.out.println("Hello World");
   }
}

단적인 예로 자바는 단순한 출력문을 작성할 때에도 위와 같은 코드를 작성해야 합니다.

 

하지만 파이썬의 경우

print("Hello World")

위 한 줄이면 동일한 기능의 코드를 작성할 수 있습니다.

 

같은 기능의 코드를 굳이 어렵게 작성할 이유가 없고,

코딩 테스트의 경우 시간의 제약이 있기 때문에 파이썬의 쉽다는 장점은 유리한 면이 있습니다.

 

 

C++의 최대 장점은 효율성입니다.

https://www.acmicpc.net/problem/1260

 

1260번: DFS와 BFS

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사

www.acmicpc.net

예시로 위 문제를 거의 동일한 로직으로 작성해보았는데요.

C++가 Kotlin(Java) 에 비해 명확히 빠르다는 것을 알 수 있습니다.

 

▶ C++ 전체 코드

더보기
// 1260 DFS와 BFS
#include<iostream>
#include<queue>
using namespace std;

int n; // 정점의 개수
int m; // 간선의 개수
int v; // 탐색을 시작할 정점의 번호

int adj[1001][1001]; // 인접행렬
int visit[1001]; // 방문여부

void dfs(int x) {
	cout << x << " ";
	visit[x] = 1;
	for (int i = 1; i <= n; i++) {
		if (visit[i] == 1 || adj[x][i] == 0) {
			continue;
		}
		dfs(i);
	}
}


void bfs(int x) {
    queue<int> q;           
    q.push(x);
    visit[x] = 0;            
    while (!q.empty()) {
        x = q.front();
        cout << q.front() << ' ';
        q.pop();
        for (int i = 1; i <= n; i++) {
            if (visit[i] == 0 || adj[x][i] == 0)
                continue;
            q.push(i);
            visit[i] = 0;
        }
    }
}


int main() {
	int x, y;

	cin >> n >> m >> v;

	for (int i = 0; i < m; i++) {
		cin >> x >> y;
		adj[x][y] = adj[y][x] = 1;
	}
	dfs(v);
	cout << endl;
	bfs(v);

	return 0;
}

▶ Kotlin 전체 코드

더보기
// [백준] 1260. DFS와 BFS (Kotlin)
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.*

var n = 0 // 정점의 개수
var m = 0 // 간선의 개수
var v = 0 // 탐색을 시작할 정점의 번호

lateinit var adj : Array<Array<Int>> // 인접 행렬
lateinit var visit : Array<Int> // 방문 여부

fun main() = with(BufferedReader(InputStreamReader(System.`in`))){
    // 정점, 간선, 번호
    val st = readLine().split(" ").map { it.toInt() }
    n = st[0]
    m = st[1]
    v = st[2]

    adj = Array(n + 1) { Array (n + 1) { 0 } }
    visit = Array(n + 1) { 0 }

    // 입력
    for(i in 0 until m){
        val (x,y) = readLine().split(" ").map { it.toInt() }
        adj[x][y] = 1
        adj[y][x] = 1
    }

    dfs(v)
    println()
    bfs(v)
}

fun dfs(x: Int){
    print("$x ")
    visit[x] = 1

    for(i in 1 .. n){
        if(visit[i] == 1 || adj[x][i] == 0){
            continue
        }
        dfs(i);
    }
}

fun bfs(x: Int){
    val q: Queue<Int> = LinkedList()
    q.offer(x)
    visit[x] = 0

    while (q.isNotEmpty()){
        val cur = q.poll()
        print("$cur ")

        // DFS에서 방문처리를 1로 했으므로 여기선 0으로
        for(i in 1 .. n){
            if(visit[i] == 0 || adj[cur][i] == 0){
                continue
            }
            q.offer(i)
            visit[i] = 0
        }
    }
}

 

그로 인해 문제에서 특정 언어보다 시간제한을 적게 주는 경우도 있으나,

대부분의 경우에는 다른 언어보다 효율성면에서 크게 유리합니다.

 

그렇다면 위 언어를 모른다 해서, 취업 코딩 테스트를 위해 다른 언어를 공부해야 할까요?

 

 

 

2️⃣ 취업을 위한 코딩 테스트를 위해 다른 언어 공부를 해야 할까?

결론부터 말하자면 아니다 입니다!

 

물론 언어를 많이 알수록 좋습니다.

또한 알고리즘 대회를 준비한다면 효율적인 언어를 사용하는 것이 좋겠죠.

 

하지만 그게 아니라면 자신이 취업하고자 하는 분야의 언어, 자신이 평소에 사용하는 언어를 사용하는 것이 좋습니다.

예를 들어 자신이 백엔드 분야에 관심이 있다면 Java를, 머신러닝이나 데이터에 관심이 많다면 Python를 사용할 수 있겠죠.

 

여러 가지 하느라 바쁜 취준생이 단순히 취업 코딩 테스트를 목적으로 다른 언어를 공부하는 것은 비효율적이라고 생각해요.

제 경험상 코딩 테스트에서 풀지 못한 문제들은 전부 제 구현 능력의 문제..😢 였을 뿐 언어 때문에 풀지 못한 문제는 없었습니다!

로직을 잘 작성한다면 무슨 언어로든지 효율적인 알고리즘을 작성할 수 있습니다!

기업 코딩 테스트에서는 대회 수준의 알고리즘, 시간 복잡도 등을 요구하지 않습니다.

 

또한 자신의 분야의 언어로 코딩 테스트를 공부하는 것을 추천드리는 이유는

그 언어를 자주 사용해보면서 배울 수 있는 것이 많기 때문입니다!

 

저는 Java로 안드로이드 개발을 진행하다가 도중에 Kotlin으로 전향하게 되었는데요.

그 과정에서 기존에 C++, Java 등으로 풀던 알고리즘 문제들을 Kotlin으로 풀기 시작했습니다!

결과적으로 그 언어에 대한 이해도가 훨씬 향상되어 실제 프로그램 코드를 작성할 때도 많은 도움이 되었습니다.

 

 


이렇게 간단히 저의 견해를 작성해보았는데요. 

언어에 대한 고민보다는

내가 생각한 것을 구현할 수 있는 구현 능력을 기르는 것이 훨씬 중요하다고 생각합니다.

감사합니다. 😎

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading