본문 바로가기
회고/코딩테스트 회고

[우테캠] 우아한테크캠프 7기 - 1차 코딩테스트 회고

by NewCodes 2024. 4. 14.

 

안녕하세요! NewCodes입니다!!

 

 

 

우테캠은 자바 기반의 교육형 인턴 프로그램이라 볼 수 있습니다!

 

여름방학 때만 이루어지기에

대학생도 노려보기 좋은 캠프입니다!!

 

지원자격도 졸업자, 재학생

모두 지원 가능하다고 나와있습니다!

 

 

그리고 어제 우아한테크캠프 7기 1차 코딩테스트를 봤습니다!

 

이에 대한 저의 회고와 약간의 Tip을 공유해보고자 합니다!

 

 


📌 1차 코딩테스트 참고 사항

  • 언어: 자바 (자바만 가능합니다!)
  • 문제 수: 8문제 (알고리즘 3문제 + CS 객관식 5문제)
  • 시간: 3시간 (13:00 ~ 16:00)
  • 감독: 화상감독 (프로그래머스 + 모니토 앱)
  • 제약 조건
    • 인터넷 검색, 레퍼런스 금지
    • 외부 IDE 사용 금지
    • 물 마시는 것 금지
    • 메모 사용(빈 종이, 펜) 가능
  • 문제 풀이 상태
    • 🟢 : 자신있게 푼 문제 (1솔)
    • 🟡 : 풀긴 했지만, 확신이 없는 문제 (0.5솔)
    • 🔴 : 테스트케이스도 못 푼 문제 (0솔)

 

 


🟢 1번

문제 내가 유리한 대회 고르기
유형 정렬
난이도 실버
풀이 시간 15분

 

1번은 비교적 로직이 간단한 문제였습니다. for문 돌고, 기준에 따라 잘 정렬해 주면 됐습니다. 

 

객체지향적으로 코드를 짜는 데 집중했고, 크게 피드백 남길 만한 문제는 아닌 것 같습니다. 넘어가겠습니다!

 

 


🟡 2번

문제 + 연산 이용해서 한 자리 수 만들기
유형 백트랙킹
난이도 골드
풀이 시간 85분

 

숫자를 잘 다뤄야 하는 문제였습니다. 저는 평소 알고리즘 문제에서 숫자를 많이 다뤄본 경험은 없어서 다소 어려움을 겪었습니다. 그래서 숫자 대신 문자열로 바꿔가며 문제를 푸는 방식을 채택했습니다. 

 

처음에는 시간 복잡도 신경 쓰느라 이 방법, 저 방법 고안하고 설계하느라 시간을 많이 보냈습니다. DP로 풀어볼까 생각도 했는데 최적 부분 구조가 성립되지 않는 것 같더라고요. 부분 문제들의 최적해가 전체 문제에서 최적해를 보장하지 않았던 것 같습니다. 

 

다르게 생각해서 규칙성을 찾으려 여러 숫자 임의로 설정해 보고 에이포 종이에 적어보며 생각했습니다. 하지만, 이렇다 할 규칙도 나오지는 않더군요. 

 

그래서 시간을 많이 보내고, 결국엔 백트랙킹 방식의 완탐해보기로 했습니다. '완탐으로 하다 보면 더 좋은 풀이가 떠오를 수도 있겠지~'라고 생각하기도 했습니다. 

 

그렇게 백트랙킹으로 구현을 완료했고 테케 통과를 할 수 있었습니다. 

 

 

하지만, 시험 끝나고 나니 제가 잘못 생각한 실수를 발견했습니다...!

시간 복잡도를 잘못 계산했습니다. 

 

저는 'n은 10의 15제곱 이하의 수' + '시간제한: 10초'의 조건을 보고 막연하게 '아~ 복잡도 N으로 풀라는 거구나.'라고 생각했습니다. 그래서 DP를 고려하거나, 임의의 경우의 수 직접 시행해 보며 규칙성 찾는 등의 행동을 하며 효율적인 방법을 찾으려 했습니다. 하지만 이는 틀렸습니다. 

 

조건 자체는 얼핏 보면 시간 복잡도 N을 요구하는 것처럼 보이지만, 실상 문제 풀이는 그러하지 않았습니다. 문제에서 요구하는 건 '자릿수'에 관한 부분이었습니다. 숫자가 10의 15 제곱이어도 자릿수는 15개입니다. 하하.. 대단히 잘못 생각했죠. 

 

해당 문제 풀이에서 시간 복잡도를 계산하는 기준이 '자릿수'였지만, 저는 'N' 크기 자체로 오인해 버렸습니다. 이건 돌이켜보면 제 문제 풀이과정에서 디테일이 다소 떨어지는 부분이었네요.

 

이를 통해 제 평소의 알고리즘 학습을 되돌아보겠습니다.

 

1. 시간 복잡도 꼼꼼하게 체크하자!!

 : 돌이켜보면 저는 평소에 알고리즘 문제를 풀 때 시간 복잡도를 꼼꼼하게 체크하지는 않았습니다. 그저 대충 계산해 보고 '어 되겠네~'하고 다음 단계로 넘어갔습니다. 이렇게 대강 어림짐작하는 습관이 어느새 스노우볼처럼 커졌고, 이번 코테에서 그 스노우볼이 시험에 영향을 준 것 같습니다. 

시간 복잡도를 대강 계산하는 습관이 든 이유는 아무래도 2번과도 연관이 있습니다.

 

2. 유형 랜덤 문제 풀이하는 습관 들이자!

 : 저는 항상 유형을 선택하고 문제를 푸는 습관이 있습니다. 유형을 알고 푸는 것이죠. 이렇게 하면 실제 코딩테스트와는 다른 점이 있습니다. 어떤 알고리즘을 선택해야 할지에 대한 확신이 생겨, 시간 복잡도를 대강 계산하고 풀이 설계를 하는 데 있어 다채로운 생각을 하지 못하게 됩니다. 

 

앞으로는 유형을 모르고 풀이하는 문제 수도 점차 늘려가야 할 것 같습니다. 특정 알고리즘을 깊게 학습한다는 명분으로 그동안 알고리즘 유형을 선택하고 문제를 풀었습니다. 이제는 그 비중을 달리해야겠습니다.

 

 

결과적으로 아쉬운 부분은 두 가지입니다. 

1. int를 String으로 연속적으로 변환해서 풀이한 점 

 : 백트랙킹을 하면서 Integer.parseInt(), Integer.toString() 함수를 빈번하게 사용했습니다. 한두 번이면 상관없는데, 백트랙킹 함수가 작동할 때마다 변환하니 실행 시간이 다소 올라갈 것 같습니다. 

 

2. 적절히 프루닝하지 않은 점

 : 시간이 부족해서 프루닝(가지치기)하지 못했습니다. 백트랙킹을 수행하면서 유망하지 않은 가지는 return 했어야 했는데, 유망하지 않더라도 끝까지 수행되도록 코드를 작성했습니다. 

 

이 두 가지로 인해 실행 시간이 다소 상승할 것으로 예상합니다. 자칫하면 시간 초과가 걸릴 수도 있지 않을까 생각합니다. 또한, 구현을 마치고 나서 예외적인 경우를 생각해보지 못했어서 히든 테케에 점수를 못 받을 수도 있을 것 같습니다.

 

백트랙킹은 제가 연습을 많이 했었던 유형인데 아쉽네요.. ㅎㅎ

 

 


🟡 3번

문제 세율표 통해 수입 추정하기
유형 수학 or 이분탐색
난이도 골드
풀이 시간 70분

 

유형이 하나로 정리되진 않는 것 같습니다. 이분탐색 혹은 수학인 것 같네요!

 

저는 수학 방정식을 통해서 문제를 풀었습니다! x, y에 관한 일차방정식 세워서 교점을 구한 뒤, 세율이 같을 때만 예외처리하는 방식으로 풀었습니다.

 

제 경험 중 알고리즘 문제에서 방정식을 푸는 건 거의 처음이었던 것 같습니다. 그래서 그런지 방정식을 세우고 깔끔히 정리하는 데 시간이 조금 지체되었습니다.

 

중간에 집중력이 떨어져서 그런지 어이없는 실수도 좀 있었습니다. 예를 들면, if 문 조건을 반대로 쓰는 등의 실수였습니다.

 

3시간 동안 코테 보는 건 처음이라 화장실 안 가고, 물도 안 마신 채로 집중하는 게 조금 낯설었던 것 같습니다. 그리고 또 저는 물을 자주 마시는 편이라서요 ㅎㅎ.. 

 

해당 문제에서 또 어려움을 겪었던 부분이 숫자를 계산하는 부분이었습니다. double을 많이 다뤄본 적이 없어서 한 번에 깔끔하게 코드를 작성하지 못하고 컴파일 에러를 보면서 코드를 고쳐나갔습니다. 

 

시간 초과 걸릴 테스트케이스가 있을 듯합니다. 

세율이 같을 때 예외처리를 해주는 건 잘했습니다. 하지만, 세율이 같을 때 income 추정하는 로직을 효율적으로 짜진 못했습니다. 거의 가능한 경우의 수를 다 찾아보는 방식의 로직이었습니다. 

 

다시 푼다면, 아래 두 금액을 계산한 뒤, 구간 내에 속한 금액(x, y 둘 다)인지 확인하고, x가 더 적은 금액을 고르도록 리팩토링하고 싶네요.

  • 해당 세율 최소 구간에 근접한 1000 단위의 금액
  • 해당 세율 최대 구간에 근접한 1000 단위의 금액

 

단톡방에서 이분 탐색으로 풀었다고 하는 분들도 많더라고요! 제가 이분 탐색을 알긴 알지만, 이분 탐색을 응용한 문제들을 풀어본 적이 거의 없어서 대강은 감이 오지만 구체적으로 구현하지는 못할 것 같습니다. 

 

 

+) 아래 백준은 3번과 유사한 문제라고 합니다! 

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

 

17387번: 선분 교차 2

첫째 줄에 L1의 양 끝 점 x1, y1, x2, y2가, 둘째 줄에 L2의 양 끝 점 x3, y3, x4, y4가 주어진다.

www.acmicpc.net

 


🟢 CS 객관식 5 문항

문제 정말 기본적인 CS
난이도 쉬움
풀이 시간 5분 미만

 

객관식은 어렵지는 않았습니다. 딱히 크게 사고해서 풀어야 하는 문제도 없었고, 기본적인 개념에 대해 묻는 문제들이 주를 이루었습니다. 

 

나왔던 유형에 대해서 언급을 해도 될진 모르겠네요. 사실 우테캠 CS 문제가 작년까지만 하더라도 없었는데 이번에 갑자기 생겼더라고요! 시험 보기 전 날에 알았습니다.. ㅎㅎ

 

혹시 또 다음에 CS 테스트가 있다면 아래 깃허브 한 번 읽어보시는 거 추천드립니다! 꼭 우테캠을 위해서가 아니더라도 도움이 되실 겁니다. 여기에 더해서 SQL도 조금 공부하시면 좋을 것 같네요!

 

https://github.com/JaeYeopHan/Interview_Question_for_Beginner

 

저는 소프트웨어 마에스트로 면접을 준비하면서 위 깃허브를 통해 CS 기본 지식들을 공부한 게 도움이 되었습니다. 그리고, 소마 코딩테스트에서는 SQL도 나와서 SQL 공부한 것도 도움이 되었고요! 

 

역시 어떤 경험이든 나중에 다 직접적으로든 간접적으로든 도움이 되는 것 같습니다! 실패한 경험이어도 이는 곧 성공으로 이어지기 위한 발판이라 생각합니다. 

 

 


1주일 간 준비했던 과정 

이번에 일주일 간 하루에 2시간 정도씩 투자하며 알고리즘을 학습했습니다. 저의 취약 유형인 DP, 그리디를 보완했습니다. 또한 유니온 파인드, 크루스칼, 투 포인터, 비트마스킹 등의 알고리즘을 새롭게 학습했습니다. 카카오 기출문제도 좀 풀었고요!

 

나름 알차게 보낸 것 같습니다! 우테캠이 떨어지더라도 알고리즘 학습한 시간이 의미가 있었으면 하는 바람이 있었습니다. 덕분에 취약 유형을 보완할 수 있었고, 새롭게 배운 알고리즘도 많았습니다!!!

 

백준 단계별로 풀어보기는 정말 알고리즘 학습하기 좋은 자료인 것 같습니다. 앞으로 평소에도 단계별로 풀어보기 아직 안 푼 것들 풀어보려 합니다!! 다만 랜덤 유형 풀이 비중도 늘려야겠습니다!!

 

백준 골드5 달성!

 

그리고 백준 골드 5를 달성했습니다..!! 올해 1월에 처음 백준을 풀 때 골드 5만 되어도 참 좋겠다는 생각을 했었는데, 이게 현실이 되었네요 ㅎㅎ 기분이 좋습니다!

 

 


회고 요약

피드백

  1. 알고리즘 수학 유형 학습
  2. 알고리즘 이분 탐색 응용문제 풀이
  3. 자바 double, int, long 등의 숫자형 다루는 연습
  4. 시간 복잡도 엄밀히 계산하는 습관 들이기
  5. 알고리즘 문제 유형 랜덤으로 푸는 비중 늘리기
  6. 3시간 이상 동안 코딩테스트 보는 연습하기

 

CS 문제에 대해

  1. CS 객관식 테스트는 처음이었지만, 다 맞은 듯함
  2. 소마 면접 준비하면서 CS 학습한 게 도움이 됐음
  3. 기본적인 문제이긴 했지만, 소마를 준비하면서 쌓인 지식 없이는 대체로 풀기 어려웠을 듯

 


글을 끝마치며

우테캠은 카톡 오픈채팅방이 없길래 제가 만들었습니다! 소마 코테 볼 때 다같이 풀이 아이디어 공유하고, 시험에 관한 정보 얻으면서 얻은 것들이 많았어서 이러한 경험을 또 하고 싶어 만들었습니다. 

 

93명이나 들어왔어요!

 

대체로 3솔이 많군요..!

 

단톡방 덕분에 객관식 답도 맞춰볼 수 있었고, 다른 사람들의 풀이를 들어볼 수 있어 피드백하는 데 도움이 되었네요! 

 

단톡방에 의하면 작년 기준 우테캠 1차 결과가 4일 뒤에 발표되었다고 하네요. 아마 수요일에 나오겠네요!

 

결과는 크게 기대하지는 않습니다. 부족한 점이 드러난 시험이었고, 이를 바탕으로 알고리즘 학습 방식에 관해 보완하는 데 의의를 두겠습니다.

 

물론 붙여주신다면 2차 과제 테스트도 열심히 보겠습니다!! 우테캠 되기만 한다면 꼭 가고 싶네요 ㅎㅎ

 

이상 회고 마치겠습니다!


2024.04.17(수) 합격 발표!

'우아한형제들'에서 메일 온 게 뭔가 웅장하네요 ㅎㅎ

 

 

와!! 합격했습니다 ㅎㅎ

 

솔직히 큰 기대를 하지는 않았지만, 그래도 기분이 좋네요!! 

과제 테스트도 성실히 임해보겠습니다!!