첫 코딩테스트
개발쪽으로 완전히 진로를 틀어야겠다고 마음 먹었을 때 학교에 붙은 포스터 하나가 눈에 띄었다.
삼성SDS 동계 알고리즘 특강이 바로 그것이다.
지금도 마찬가지지만 특강을 신청하는 12월초에도 프로그램 언어는 C++ 그마저도 기본적인 문법만 알고있었고 당연히 알고리즘에 관해선 하나도 몰랐다. 이때 필자는 이 포스터를 보고 "와 그렇다면 알고리즘을 공부해야하는 나에게는 최고의 특강이다! 거기다가 삼성이라니!" 라고 외치며 지원서를 작성해 특강을 신청했다.
입과테스트는 12월 12일부터 18일까지 진행했는데 아직 학기가 끝나지 않아 마무리를 하고 16일부터 테스트에 응시하였다. 문제는 여기서부터였다. 포스터에 알고리즘 기초, 자료구조론 등등을 교육한다는 내용이 있어 특강 내용이 기초를 가르치는 만큼 입과테스트는 프로그램 언어를 얼마나 다룰 줄 아는가를 물어보는 테스트로 지레짐작했던 것이다.
하지만 필자가 마주한 테스트는 그런 허접한 것이 아닌 말로만 듣던 코딩테스트 문제였다. 처음으로 본 코딩테스트였다. 총 5문제. 당연하게도 한 문제도 몰랐다. 정확히 말하면 모든 문제를 이해했고 어떤 input값에 대해 어떤 과정을 거치면 답이 나올지 머리 속에 그려졌지만 문제는 어떻게 코드를 작성해야 하는지 하나도 몰랐다.
이렇게 말하면 어느 수준인지 감이 잘 안올 수 있는데 말해주면 예시 입력값이라고 주어진 값들이 있었는데 음... 이걸 입력으로 받는 main 함수조차 어떻게 짜야하는지 감이 안왔다.
이래도되나 싶었지만 문제를 풀긴 풀어야하니 구글링을 시도했는데 비슷한 유형인지 아닌지조차 모르겠고 알아낸 것은 코딩테스트의 알고리즘에 대해서 이해하고 있어야만 풀 수 있는 문제들이라는 것 정도였다. 그리고 내가 본 블로그들이 그런건지 내가 그냥 지식이 부족해서 범접할 수 없었던 것인지 설명이 너무나도 짧고 이해할 수가 없어 도움이 전혀 되지 않았다.
결국 두문제를 풀고 시험을 마무리했다. 잠도 안자고 하루종일 붙잡고 풀었는데 겨우 두 문제라니... 재능이 없나라는 우울한 생각도 많이 들게한 시간이었다.
다른 특강 지원생분들의 QnA를 보니 만점이신분들도 꽤 많던데 나는 제출한 두 문제의 결과 70~80점대가 나온 것으로 보아 아마도 특강에 떨어지지 않았을까 추측하고 있다. 세 문제는 0점이니... 결과는 이 글을 쓰는 내일 29일날 나오지만 말이다.
제출했던 답안코드에 대해서 조금 얘기하면 필자가 가장 많이 나왔던 Error는 memory error였다. 사실 3번 문제도 어떻게 어떻게 구현을 했는데 계속 이 error가 발생해 포기하고 제출할 수 밖에 없었다. 제출하고 나서야 구글링과 학교에서 배운 자료구조론의 시간복잡도의 개념을 통해 O(n^2)의 루프문을 남발했으니 당연한 결과였다는 것을 알게되었다.
마지막으로 제출했던 두 문제중 그나마 작성을 잘했다고 생각한 코드를 나중에 충분히 알고리즘을 공부하고 나서 다시 보자는 의미로 올린다. 혹여 이 글을 보는 사람이 있다면 참고는 절대 하지않길 바란다.
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
int solution(int N, vector<int> a)
{
int count = 0;
int* circle = new int[N];
for (int i = 0; i < N; i++)
{
circle[i] = a[i];
}
for (int i = 0; i < N; i++)
{
for (int j = i + 1; j < N; j++)
{
if ((sqrt(circle[i] + circle[j]) - (long long)sqrt(circle[i] + circle[j])) == 0)
{
count++;
}
}
}
return count;
}
int main()
{
int T;
cin >> T;
vector<int> v;
for (int j = 0; j < T; j++)
{
int N;
cin >> N;
for (int i = 0; i < N; i++)
{
int number;
cin >> number;
v.push_back(number);
}
cout << "#" << j + 1 << " " << solution(N, v) << endl;
for (int i = 0; i < N; i++)
{
v.pop_back();
}
}
}