SW 마에스트로 12기 코딩테스트 - SW ma-eseuteulo 12gi kodingteseuteu

1차 알고리즘 문제는 단순 구현, DFS, 슬라이딩 윈도우, 간단한 분할정복, 냅색dp정도의 주제가 나왔고, 문제 자체가 어렵다기보다는 문제를 정확히 읽고 해당 주제의 내용을 구현할 수 있는지를 물어보는 문제들이 다수여서 내년 기수를 준비하는 분이시라면 자주 빈출되는 주제들을 꾸준히 푸는 연습을 하시면 크게 어려움이 없으실 것 같습니다. 

2차 알고리즘 문제는 BFS, 방향 그래프에서 사이클 탐색, 2차원 분할정복의 주제로 나왔고, 1차에 비해서 다소 어려워진 내용들로 나왔습니다. 제가 느끼기엔 solved.ac기준 골드3이하의 난이도로 체감이 되었고, 문제 수가 3문제로 적었기에 넉넉히 시간내에 풀 수 있었습니다. 

SQL같은 경우 아직 DB를 수강하지 않은 상태여서 이번 기회를 통해 SQL을 처음 접했습니다. 링크에서 sql easy문제와 프로그래머스 SQL정도만 풀고 시험을 봤는데 풀던 것들과 비슷하게 select, join를 사용하여 간단한 3~4줄짜리 쿼리를 짜는 문제였습니다.  

dfs인지 모르게 문제가 설계되어있다. 1차원 배열이 주어지고, 각 칸에는 여기서 몇번째 칸으로 이동 가능한지 써있다. 이걸 계속 타고가다보면 무한 loop를 돌게 되는 구간이 있는데, 그 무한 loop의 길이중 제일 짧은것을 출력해야 한다.(입력은 무조건 배열의 범위 안으로 이동가능하게 들어온다)

 

사실 그래프 형식으로 문제가 나오면 누구나 dfs라는 것을 알 수 있겠지만, 단지 노드를 1차원배열로, 간선을 각 칸의 값으로 대체했을 뿐인데 여기서 시간이 오래걸렸다는 분들이 많았다. 

 

단순 코테 통과용 알고리즘을 설명하면, 모든 점에서 한번씩 출발을 해 봐서 그때의 loop길이를 구하면 된다. loop 길이를 구하는 방법은 단순히 dfs의 depth를 이용해서, dfs타고 가는데 내가 이미 방문해서 지나온 정점을 만나면 현재의 depth - 그 정점에 기록된 depth라는 것을 알 수 있다.

 

하지만 이런 경우는 O(n^2)이다. 만약 모든 배열이 바로 오른쪽칸으로만 이동하고, 배열의 맨 오른쪽 칸은 0번칸으로 이동하도록 설계되어있다고 하면, 하나의 출발지는 배열을 전부 순회하게 되고, 모든 출발지는 같은 루프 안에 있으므로 순회 n을 n번 하는 것이다. 이렇게 구현하면 면접때 질문이 날아온다. 실제로 나 빼고 모든 면접자들이 이 문제 더 최적화해서 풀 수 없겠냐고 질문을 받았는데.. 아무도 정답을 말하지 못했다. 

 

위 알고리즘의 문제는, 중복방문이다. 이미 한번 탐색한 루트로 빠지는 경로에 합류하게 되는 경우, 더이상 탐색을 할 이유가 없다. 따라서 한번의 dfs가 끝날때, 이미 check했다는 것을 기록한다. 그렇다면 다음 출발지에서 또 출발을 하다가 현재 돌고있는 dfs를 만나면 지금까지의 loop의 최솟값을 갱신 가능한지 확인하면 되는거고, 그렇지 않고 이미 check된 곳을 만나면 더이상 dfs를 탈 이유가 없고 그냥 다음 출발지부터 다시 시작해보면 되는 것이다. 이렇게 하면 O(n) 알고리즘이 된다.

 

 

2-3. 분할정복 문제

이정도 난이도면 대회준비하는 인원이 아니고서야 확실한 solution을 말할수 없겠구나! 라고 생각이 들었다.

n^2의 배열이 주어지는데, 땅을 정확히 절반씩만 챙겨가는 것을 반복한다. 이때, 그 챙겨가는 땅의 비용은 그 구간에 있는 모든 값들의 max이다. 이때 이 max의 합을 최대화 하는 문제이다.

 

시간복잡도는 전처리시 O(n^4), 전처리 안하고 쌩으로 풀면 O(n^5)이다.

 

이거같은 경우는 나를 포함한 모두에게 물어보았는데... 당시에 O(n^2 * 2^(log n^2)) 이어서 O(n^4)인 것을 생각없이 O(n^2 log n)이라고 했다... 집에와서 다시 계산해 보니 틀렸다는 것을 알았다. 하지만 나머지 면접인원들은 아예 대답을 하지 못했으나, 어쨌든 전처리하는 방법까지 설명을 했으니 조금 더 잘 보일 수 있었나보다 ㅋ.ㅋ

 

2-4. SQL

역시나 정보처리기능사 수준의 문제가 나온다. 

 

2-5. 웹

아.. 모르는 분야라 넘겼다.

 

보면 알고리즘 문제들이 조금 어렵다. 단순히 기업 코테 뚫는 용으로 공부를 하면, 시간복잡도 최적화를 하기가 힘들다. 2차코테를 뚫고 과거의 프로젝트로 면접을 뚫으려면 상관이 없겠지만, 나처럼 알고리즘만 하면서 프로젝트를 만회하려는 인원들은 정말정말 알고리즘 문제 설명에 신경을 쓰고, 또 2차코테 당시에 최적화된 시간복잡도를 사용하여 문제를 풀어야 한다. 대충 solved 기준 플레 3 이상은 되어야 한다고 보면 된다.(2시간 꽉이 아니고 1시간 내로 알고3 + sql 솔브 기준) 평소에 알고리즘 문제를 풀더라도 최적화를 계속 하는 연습을 기르는 것을 추천한다.

 

 

3. 면접

면접은 한 타임당 4개의 방에서 진행되었는데, 방마다 면접 스타일이 전부 달랐다. 어떤 방은 코테는 전혀 물어보지 않고 과거 프로젝트에 관한 질문들만 한 방도 있고, 자소서에 관한 얘기만 하다 끝나느 방도 있다. 방 운이 조금 필요하다고 본다. 나는 프로젝트 경험이 다른 지원자에 비해선 부족하고 더구나 프레임워크쪽은 거의 모른다고 보는게 맞기에... 면접 준비하면서 굉장히 스트레스를 많이 받았다.

 

하지만 내가 받은 질문들은 다음과 같았다.

 

iot, 5G, 클라우딩컴퓨터, 인공지능, 빅데이터를 신체에 비유해서 설명하시오.

만나고 싶은 팀원과 만나기 싫은 팀원은?

소마를 꼭 해야하는 이유?

과거에 진행했던 프로젝트를 상용화 하기위해서 어떻게 해야하는가?(다행이 어떤 프로젝트인지는 물어보지 않았다.)

원하는 용어를 단 세문장으로 표현해 보아라.

만나기 싫은 팀원을 만나게 되면 어떻게 할 것인지?

본인이 좋아하는(자주쓰는 언어가 아닌) / 싫어하는 언어

추후 활동계획

코테 문제중에 아쉬웠던거, 더 잘 풀수 있었던거

본인이 팀에 어떤 부분으로 기여를 할 수 있는가?

마지막 하고싶은말

 

 

자기소개는 하지 않았다. 하지만 자기소개/마지막 하고싶은 말은 반드시 준비해 가는것을 추천한다.

특히 마지막 하고싶은 말은 본인이 이런 곳에 강점이 있다라고 하면 추가질문을 받아서 점수를 딸 수 있는 기회이다!

 

질문간에 연결고리가 은근히 있는데, 계속 본인이 정한 방향으로 밀어붙이는것을 추천한다.

소마를 꼭 해야하는 이유 - 추후 활동 계획 이라든가,

만나기싫은 팀원 - 만나게 된다면 - 팀에 기여할 수 있는 방법 등 막상 긴장하면 놓치지만 연관된 질문들이 들어온다.

 

 

 

 

면접이 중요하긴 하지만, 2차코테 점수도 굉장히 중요하다. 2차코테에서 점수를 많이 받아놓으면, 면접에서 조금 말려도 충분히 경쟁을 뚫을 수 있다. 면접의 경쟁률은 2대1이었다. 여기까지 와서 떨어지면 아쉬우니까..

 

 

합격은 했지만 설렘 반 긴장 반이다. 당장 4월부터 프로젝트를 들어가는데, 시험기간과 겹치는데다 개발능력을 올리기엔 조금 짧은 시간이라 부담이 된다. 하지만 알고리즘 사냥꾼 답게 개발도 사냥을 시작해보겠다. 추후 시간이 된다면 소마 진행 내용도 올려보도록 하겠다.

 예비 연수 기간이 생각보다 중요했다. 예비 연수 기간은 자유멘토링 + 팀빌딩 기간인데, 이 기간을 잘 이용해야 한다. 하고 싶은 프로젝트가 있다면 다른 연수생들에게 콜드 메일을 보내보고, 없다면 기획 멘토링을 많이 받으면서 하고 싶은 프로젝트를 정하고 팀원을 구해라. 여기서 중요한 것은 프로젝트를 정하는 것이 아니라 팀원을 구하는 것이 핵심이다. 어차피 팀원을 구하기 전에 생각했던 프로젝트 주제는 팀원을 구하고, 피드백 받고, 기획을 구체화하는 과정에서 변화할 가능성이 매우 높다. 본 연수가 시작되고 나서 팀빌딩이 되면 기획을 구체화하고 기획서 작성할 시간이 매우 촉박하다.

이번에 SW마에스트로 12기를 준비하면서 이전 기수 선배님들과 지원해주셨던 모든 분들의 글을 많이 참고했습니다. 사전 정보가 거의 없고, 주변에 같이 준비하거나 물어볼 사람이 거의 없었던 저에게는 이런 정보들이 정말 소중했기에 저도 12기 그 이후를 준비하시는 분들을 위해 간단히 지원 과정을 기록해두려고 합니다. (혹시 궁금하신 점이 있다면 댓글로 편하게 물어봐주세요~)

 

서류 전형

서류 전형은 합격률 99.9%라고 알고 있을 정도로 내용을 성실하게 작성해주신 분들이라면 다 합격하는 것으로 알고 있습니다. 하지만 나중에 면접까지 가신다면 이때 작성한 서류가 곧 면접 내용이 되니 거짓된 정보 없이, 최대한 성실하게 작성해주시고 작성 후에는 꼭!! 저장해두셔서 나중에 읽어보셔야 합니다! 

그리고 사실 저는 비전공자 출신에 국비학원을 통해 프로그래밍을 처음 배우는 입장에서 자기소개서에 쓸만한 프로젝트가 없었습니다. 국비학원에서 진행했던 프로젝트는 파이썬과 자바를 이용한 프로젝트였기에 프론트엔드 개발자로써 작성하는 자기소개서에는 더더욱 쓸 수가 없었습니다. 그래서 자기소개서 1번 문항을 협업에 포인트를 두어서 작성했습니다. 소마를 지원할 때 진행했던 프로젝트가 있다면 당연히 유리하겠지만, 없더라도 자신의 다른 장점을 살려서 작성하신다면 충분히 합격하실 수 있다고 생각합니다. :D

 

자기소개서

  1. 소프트웨어분야 전문성을 키우기 위해 남들과 달리 특별한 노력을 한 경험을 서술하여 주시기 바랍니다.
  2. 귀하의 장래희망을 서술하여 주시기 바랍니다.

 

연수 계획서

  1. 귀하께서는 20201년도 SW마에스트로 연수과정에서 동료 연수생들과 협력하여 새로운 프로젝트를 완성하여야 합니다. 어떤 능력을 갖춘 연수생들과 어떤 프로젝트를 어떻게 수행할 것인지 귀하의 구체적인 계획을 서술하여 주시기 바랍니다.
  2. 2021년도 SW 마에스트로 연수 과정에서는 연수생에게 장학금, IT기기 및 프로젝트 활동비 등을 지원할 예정이며, 본인이 희망하는 온라인 강의와 프로젝트 수행을 도와주는 멘토를 통해 귀하의 SW능력을 향상, 발전할 수 있는 기회를 제공하고 있습니다. 앞으로 귀하께서 본 과정을 통해 이루고자 하는 목표가 무엇인지 구체적으로 서술하여 주시기 바랍니다.

 

코딩 테스트 1차 & 2차

서류 전형에 합격하셨다면 그 다음은 코딩 테스트입니다. 이번 기수 역시 작년처럼 코로나로 인해 온라인으로 진행됐습니다.

코딩 테스트 난이도는 제가 백준 기준 실버 3 정도인데, 코딩 테스트 1차 알고리즘 문제들은 풀만했고, 2차는 좀 어려웠습니다. 그리고 작년 11기부터 코딩 테스트에 WEB과 SQL 문제가 추가되었는데, 저는 알고리즘보다 WEB, SQL에 자신이 있어서 1차와 2차 모두 풀었습니다.

 

코딩 테스트 1차

코딩 테스트 1차의 경우 2시간 동안 알고리즘 6문제와 WEB 1문제, SQL 1문제로 총 8문제가 나왔습니다. 저는 알고리즘 4문제, WEB 1문제, SQL 1문제로 총 6문제를 풀었고, 통과했습니다.

  • 알고리즘 문제의 경우, 백준 실버 3 기준 무난했던 것 같습니다.
  • SQL 문제는 JOIN 정도 알고 있으면 풀 수 있는 정도로 프로래머스 SQL 고득점 KIT 정도만 미리 풀어보시면 될 것 같습니다.
  • WEB 문제는 JS는 하나도 없이 CSS만 알고 있으면 풀 수 있는 수준의 문제였습니다.

 

코딩 테스트 2차

코딩 테스트 2차의 경우 2시간 동안 알고리즘 3문제와 WEB 1문제, SQL 1문제로 총 5문제가 나왔습니다. 저는 알고리즘 1문제, WEB 1문제, SQL 1문제로 총 3문제를 풀었고, 통과했습니다. 2차 코딩 테스트의 경우, 1차와 다르게 화면 공유가 된 상태에서 진행됐습니다. 그렇기 때문에 당연히 듀얼모니터를 사용하지 못했고, 평소 듀얼 모니터가 익숙한 저는 오랜만에 13인치의 작은 맥북 화면을 보면서 코딩 테스트를 풀었어야 했습니다ㅜㅜ

  • 알고리즘 문제는 1문제는 풀었고, 1문제는 시간 부족으로 풀다가 제출하지 못했습니다.
  • SQL 문제는 이번에도 JOIN 정도 알고 있으면 되는데, 그래도 확실히 1차에 비해서는 어려웠습니다.
  • WEB 문제는 간단한 JS를 이용하는 문제였는데, 평소 듀얼모니터의 큰 화면이 아닌 13인치의 작은 화면 속에서 오타가 잘 안보여서 문제 난이도에 비해 시간이 많이 걸렸습니다.ㅜㅜ
  • (+) 면접 때 다른 분들과 2차 코딩테스트를 몇 문제 정도 풀었는지 얘기했었는데, 평균 3문제였습니다!

 

면접

면접까지 볼 수 있을 것이라 기대하지 않았어서 사실 면접 준비는 코딩 테스트 2차 합격한 후부터 일주일정도 밖에 하지 못했습니다. 처음으로 개발자로써 면접을 준비하면서 그동안 공부해왔던 지식들을 다시 한 번 정리할 수 있는 기회가 되었고, 앞으로 어떻게 공부해야겠다라는 생각이 들었던 소중한 기회였습니다. 

면접의 경우, 관련 글들을 찾다보면 정말 케바케라고 하던데 진짜 그렇습니다...ㅎㅎ 후기에서는 CS 관련 지식보다는 what if처럼 상황이 주어지고, 이 상황에서 어떻게 할 것인지를 물어보는 질문이 많았다라는 후기가 많았는데, 저희 면접방 같은 경우에는 CS 지식 위주의 질문들이었습니다. 그리고 공통 질문도 거의 없이, 서류에 제출했던 내용을 바탕으로 적었던 관련 기술과 프로젝트에 관한 질문이 대부분이었습니다.

 

공통 질문

  • 자기 소개 (1분)
  • 프로젝트를 진행하면서 기술적으로 제일 어려웠던 부분

 

개인 질문

  • HTML, CSS, JavaScript에 대해 간단한 설명
  • AJAX란
  • 제이쿼리란
  • 유지보수가 좋은 코드란
  • 유지보수를 할 수 있는 기법
  • 함수의 길이는 몇 줄 정도가 적절한가
  • 응집성과 결합도에 대해 설명하시오
  • 상속과 위임에 대해 설명하시오
  • 타입스크립트의 특징
  • 자바스크립트에서 동적 타이핑이 발생할 경우에 생기는 문제
  • 개인 프로젝트 관련 질문 (어떻게 구현할 것인지)

 

저는 프론트엔드 개발자를 목표로 한다고 했고, 관련 기술로는 자바스크립트와 타입스크립트를 적었습니다. 그래서 위와 같은 질문들을 받았었고, 관련 기술이 다르신 다른 면접자분들은 당연히 저와는 완전히 다른 질문들을 받았습니다.

 

솔직히 면접을 보면서 '모르겠습니다'라는 대답도 몇 번 했기 때문에 면접이 끝난 후에 진짜 망했다라는 생각만 들었는데, 솔직한 대답들이 좋은 점수를 받았는지 운이 좋게 최종적으로 소프트웨어 마에스트로 12기에 합격할 수 있게 되었습니다.