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

소프트웨어 마에스트로 15기 - 1차 코딩테스트 회고

by NewCodes 2024. 2. 25.

 

소프트웨어 마에스트로 15기 - 1차 코딩테스트 회고

 

 

 

 

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

 

 

어제인 2월 24일 토요일에 소프트웨어 마에스트로 15기 코딩테스트 1차를 응시했습니다. 

 

 

저는 평소에 알고리즘, 자료구조를 공부하지 않았습니다. 이번 소마에 합격하기 위해서 올해 1월 2일부터 코딩테스트 공부를 본격적으로 시작했습니다. 

 

 

주로 백준과 프로그래머스를 통해서 공부했으며, 선택 언어는 자바입니다. 프로그래머스로는 쉬운 기초 문제도 많이 풀었어서 '해결한 문제' 수가 조금 뻥튀기되어 있습니다 ㅎㅎ.. sql 문제도 포함되어 있습니다.

 

 

백준 59문제

 

 

프로그래머스 321문제

 

 

 

제가 그동안 공부했던 기록과 방법에 대해서는 2차 코딩테스트가 끝난 이후에 자세히 기록해 보겠습니다.

 

 

이번 글에서는 위와 같은 경험을 가진 제가 소마 코딩테스트를 어떻게 풀었는지,

그리고 피드백할 부분이 있다면 가감 없이 서술해보고자 합니다. 

 

 

문제가 정말 생생하게 기억나지만, 유출하면 안 되기에 각 문제 내용에 대해서는 간략히만 언급하겠습니다. 

 

 

각 문제의 제목과 난이도는 제 경험을 바탕으로 정한 것이니 가볍게 참고만 바랍니다. ✅는 풀이한 문제를, ❌는 못 푼 문제를 의미합니다.

 

 


✅ SQL

제목 개발자 그룹 만들기
유형 GROUP BY
풀이 시간 3분
난이도 Level 2

 

 

효자 문제인 SQL부터 가장 먼저 풀었습니다. 문제 길이가 짧았고 테이블도 하나, 조건 하나만 주어져 쉽게 풀었던 문제입니다. 문제를 읽었을 때는 처음 보는 문제라 낯설었지만, 우선 느낌이 가는 대로 GROUP BY를 했더니 감을 잡을 수 있었습니다. 

 

 

해당 문항에 대해서는 딱히 할 피드백이 없을 것 같습니다. 다만 제가 잘했던 부분을 복기해 보자면요.

 

 

SQL 문제에 대해서는 설계를 완벽히 하고 구현을 한 번에 완벽히 하는 건 어렵습니다. (물론 알고리즘도 마찬가지입니다.)

 

 

그래서 저는 한 번에 쿼리를 짜기보다는 단계적으로 조금씩 쿼리를 작성합니다. 그리고 해당 쿼리에 따라 테이블이 어떻게 리턴되는지 관찰합니다. 이를 통해 현재 작성한 쿼리에 대해 점검하고, 다음 쿼리에 대한 피드백을 얻습니다. 

 

 

해당 문제도 처음부터 풀이 아이디어를 완벽히 떠올린 건 아니었습니다. 우선 'GROUP BY 해보면 되겠는데?'라는 아이디어가 떠올랐습니다. 그리고 리턴된 테이블을 보고, 그다음 쿼리를 작성할 수 있었습니다.

 

 

그래서 한 문장으로 정리하자면 SQL 문제는 '쿼리를 작은 단위로 작성하면서 순차적으로 살을 붙여 나가는 것'이 중요합니다. (물론 제가 문제를 풀면서 개인적으로 얻은 피드백이며, 이 방법이 잘 안 맞는 분도 있으실 수도 있습니다.)

 

 

 


 1번

제목 거리 별 배달팁
유형 구현
난이도 브론즈
풀이 시간 5분

 

 

for, if문만 안다면 쉽게 풀 수 있는 문제였습니다. 딱히 얻을 피드백은 없는 것 같습니다. 

 

 

 

 


 2번

제목 지그재그 삼각형 넓이
유형 구현
난이도 실버
풀이 시간 18분

 

 

테스트 케이스에 대한 그림을 얼핏 보고 살짝 쫄았던 문제였지만, 조건이 복잡한 문제는 아니었습니다. 그나마 신경 써야 되는 부분은 직사각형 아래 변이었습니다. 아래 변 중 양 끝 꼭짓점이 하나라도 제시되지 않았다면, 직접 추가해서 삼각형 넓이를 계산해야 했습니다. 

 

 

2번이 겉보기 난이도로는 어려워 보였지만, 막상 문제를 읽고 조건을 해석하고 났을 때의 실제 난이도는 어렵지 않았습니다. 

 

 


 3번

제목 CSS 폰트 사이즈 변경
유형 구현, 자료구조(Map)
난이도 실버 ~ 골드
풀이 시간 46분

 

 

문제 조건 자체가 어렵지는 않았습니다. 해당 문제는 html에서의 id와 class 속성을 잘 알고 있다면, 이해하기 쉬운 문제였습니다.

 

 

3번 문제 피드백

이제 해당 문제에 대한 피드백을 진행해 보겠습니다. 

 

1. 생성자, 메서드에 대해 레퍼런스 참고하기

 : 순서가 있는 맵은 선언하는 생성자가 생각나지 않아서 시험에서 제시되는 '자바 레퍼런스'에서 LinkedHashMap 찾아서 생성했습니다. 기억나지 않는 생성자, 메서드가 있을 때 레퍼런스를 찾아보기로 생각하고 들어갔는데 이를 잘 실천한 것 같습니다. 

 

 

2. LinkedHashMap 정렬하기

 : 단순히 Collecionts.sort로 하면 될 것 같았지만, 에러가 나서 다른 방법으로 사전 순 정렬 조건을 충족시켰습니다. 그래서 시험 이후에 LinkedHashMap을 정렬하는 방법에 대해 학습해 봤습니다. 아래 코드는 key를 기준으로 오름차순으로 정렬하는 예시입니다. 

 

// LinkedHashMap을 값으로 정렬하기 위해 엔트리를 리스트로 변환하고 정렬하는 예시
Map<String, Integer> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put("apple", 10);
linkedHashMap.put("banana", 5);
linkedHashMap.put("orange", 8);

// LinkedHashMap의 엔트리를 키로 정렬된 리스트로 변환
List<Map.Entry<String, Integer>> entryList = new ArrayList<>(linkedHashMap.entrySet());
Collections.sort(entryList, (a, b) -> a.getKey().compareTo(b.getKey()));

// 정렬된 엔트리를 기반으로 LinkedHashMap을 다시 생성
Map<String, Integer> sortedMap = new LinkedHashMap<>();
for (Map.Entry<String, Integer> entry : entryList) {
    sortedMap.put(entry.getKey(), entry.getValue());
}

 

 

 

3. 구현하면서 생겼던 에러, null

 : String[] arr = {".21", "100"}; 예를 들어 이런 배열이 있다고 합시다. 저는 arr[0]에서 '.'을 제외한 숫자를 선택하고 싶었는데, 이를 arr[0].charAt(1) 이런 식으로 구현해 버렸습니다. 

 

앞서 구현한 코드에서 위와 같은 코드로 해도 되는 부분이 있었습니다. 이를 그대로 적용하는 실수를 범했습니다. 그렇다 보니 map에서 get할 때 '21'이 아닌 '2'로 get하니 Null 에러가 났었습니다. 

 

해당 에러를 디버깅하는 데 조금 시간이 걸렸었습니다. 처음에는 실수한 부분이 잘 안 보여서 이전에 풀었던 문제인 sql, 1번, 2번 문제를 약 5분 정도 검토하고 돌아왔습니다. 문제 풀다가 막히면 다른 문제 검토하면서 refresh한 다음, 다시 보면 잘 풀렸던 기억이 많았아서 그랬습니다. 이 또한 하나의 전략이었습니다 ㅎㅎ

 

그러고서는 구현한 코드를 차분히 읽어보니 잘못 구현한 부분을 찾을 수 있었고, substring으로 고쳤습니다. 

 

제가 시험에 들어가기 전 중요하게 생각했던 태도 중의 하나가 '코드 한 줄 한 줄에 생각을 담자!'는 것이었습니다. 해당 에러는 이게 제대로 적용이 안 되어서 생긴 문제였던 것 같습니다. 다음에는 방심하지 않고, 코드 한 줄 한 줄에 신경 써서 구현해 보겠습니다. 

 

이전에 비슷한 맥락에서 사용했던 코드를 그대로 가져오지 말고, 다시 한번 생각하여 제대로 작동하는지 확인하자!!

 

 

여기까지 해서 3번 문제에 대한 피드백을 마치겠습니다. 해당 문제는 개인적으로 Map이 가장 잘 어울리는 문제였던 것 같습니다. 

 

 


❌ 4번

제목 나머지에 따라 정렬하기
유형 구현
난이도 골드
풀이 시간 40분

 

 

4번 문제는 40분 동안 풀었지만, 못 푼 문제입니다 ㅠㅠ

 

 

이 문제에 대해서는 풀이 아이디어에 대해 시행착오가 좀 있었습니다. 처음에 고안한 아이디어는 우선순위 큐를 통해 나머지가 작은 순으로 나열하고, 나머지가 같다면 작은 숫자 순으로 나열하는 것이었습니다. 그래서 배열을 순회하며 각 index에서 하나씩 숫자를 저장하려 했습니다. 그리고 남은 숫자들을 작은 순으로 배열에 배치하려 했습니다. 

 

 

하지만 위 아이디어로는 문제의 조건을 제대로 충족시킬 수 없었습니다. 이를 코드를 작성하면서 뒤늦게 깨달았습니다. 그래서 이때 어설프게 리팩토링하려다가 시간이 좀 소모됐습니다. 좀처럼 해결되지 않자 풀이 설계를 다시 했습니다. 

 

 

그리고 설계한 목록에 따라 구현하다가 시험 시간이 다 되었습니다. 처음에 삽질을 하지 않고 설계를 좀 더 꼼꼼히 했다면 어땠을까.. 아쉬움이 남는 문제입니다. 시험이 끝나고 다음 날 위 설계로 코드를 작성해 봤습니다. 주어진 테스트 케이스 안에서는 제대로 작동하는 걸 확인했습니다. 

 

 

제가 처음에 삽질한 이유는 아래와 같습니다. 

 

1. 조건을 간과한 것.

 : 사전 순으로 하나만 리턴해야 한다는 조건을 너무 만만하게 봤습니다. 가볍게 한번 터치해 주면 해당 조건을 만족시킬 수 있을 거라 생각했습니다. 하지만, 해당 조건은 구현 코드를 작성하는 데 영향력이 큰 조건이었습니다. 

 

 

2. 풀이 아이디어를 검증하지 않은 것.

 : 설계를 엄밀히 하지 않았습니다. 떠오른 풀이 아이디어를 제대로 검증하지 않고, '맞겠지~' 하고 바로 코드를 작성했습니다. 

 

 

4번 문제 피드백

이제 피드백해 보겠습니다!!

 

1. 조건 하나하나에 민감하게 반응하고, 설계를 위해 잘 정리해 두자.

 : 쉬워 보이는 조건이라도 치명적으로 작용할 때가 있다는 걸 깨달았습니다. 문제에 있는 조건들을 잘 정리하고 기억하여 설계에서 이를 빠짐없이 반영하는 데 더 신경을 써야겠습니다.

 

 

2. 풀이 아이디어를 검증하라. (특히, 구현 위주의 문제라면 혹은 특정 규칙이 존재하는 문제라면) 

 : 역시 구현 위주의 문제들은 설계를 꼼꼼히 하는 것이 중요한 것 같습니다. 그리고 고안해 낸 아이디어가 있다면, n이 작을 때 직접 시행해 보면서 제가 생각한 아이디어, 규칙에 에러가 없는지 검증해야겠습니다. 

 

 +) n이 작을 때 직접 시행해 보며 검증했다면, 2번 문제에서 예외 케이스주어진 테스트 케이스를 통해서가 아닌 설계 단계에서 직접 알아챌 수 있었을 것 같습니다. 

 

 

 


피드백 정리

 

해당 시험에 대한 총평을 해보겠습니다. 우선, 알고리즘 지식을 요구하는 문제가 전혀 출제되지 않았습니다. 문제해결력, 사고력, 코딩 언어 능력이 있다면 충분히 풀 수 있는 문제들이었습니다. 특히 Map 자료구조, 구현, 정렬이 키포인트였습니다. 

 

 

또한, 문제에서 테스트 케이스가 나름 친절하게 주어졌다고 생각합니다. 스스로 생각해야 할 예외적인 케이스랄 게 마땅히 없었습니다.

 

 

시험 이후, 소마 단톡방에서 이러한 코테 출제가 요즈음 대부분의 코테 출제 경향이라고도 말씀하시는 걸 본 적이 있습니다. 합리적인 경향이라고 생각합니다. 개발자에게 알고리즘 및 자료구조 지식이 정말 중요하지만, 요새는 알고리즘에 강한 AI들이 넘치기에 개개인이 지식적인 요소에 너무 deep하게 파고들 필요는 없을 것 같습니다. 

 

 

저는 2개월 동안 '구현 + 빈출 유형(백트랙킹, dfs, bfs)'를 위주로 준비해 왔습니다. 이분탐색, 다익스트라, 플로이드 워셜, DP 등의 알고리즘은 각각 2~3문제씩만 풀어보고 시험이 가까울수록 해당 알고리즘은 학습하지 않았습니다. 

 

 

잘 준비해 왔던 빈출 유형이 나오지 않아 아쉽긴 하지만, 그래도 제 전략이 나름 잘 먹힌 시험이라고 생각합니다. 저는 아래 문제들을 중심으로 준비했었는데요. 남은 기간도 해당 문제들을 중심으로 공부할 예정입니다. 

 

  • 백준 - 단계별로 풀어보기, 삼성 기출문제
  • 프로그래머스 - 알고리즘 고득점 kit, 카카오 기출문제, sql 고득점 kit

 

 

마지막으로 이번 시험을 통해 얻은 피드백을 총정리해 보겠습니다. 

 

  1. 3번: 기억나지 않는 생성자, 메서드에 대해 레퍼런스  참고하기
  2. 3번: LinkedHashMap 정렬하기 - entrySet() 통해 set을 List로 저장 후 sort, 새로운 map에 저장
  3. 3번: 이전에 비슷한 맥락에서 사용했던 코드를 그대로 가져오지 말고, 다시 한번 생각하여 제대로 작동하는지 확인하자!!
  4. 4번: 풀이 아이디어를 검증하라. (특히, 구현 위주의 문제라면 혹은 특정 규칙이 존재하는 문제라면) 
  5. 4번: 조건 하나하나에 민감하게 반응하고, 설계를 위해 잘 정리해 두자.

 

  1. 문제 해석하고 벗겨내는 작업을 좀 더 충실히!! - 긴 문제 복잡해 보이는 조건들을 간단히 정리, 추상화
  2. 타임 제한 두고 구현하는 연습하기 - 구현 시간 감이 있었다면 4번에서 5분 정도 남았을 때, 다른 거 검토하는 게 나았을 듯.
  3. 코드 작성하면서 '//' 주석을 활용한 세부 설계 놓치지 말자.
  4. 방 불 켜기 or 커튼 열기 (점점 어두워짐)
  5. 시험 전 - 카페인, 초콜릿, 화장실 good

 

 

1차 코테 회고 도합 4시간 정도 한 것 같네요.. 금방 끝날 줄 알았는데, 은근 오래 걸리네요. 그래도 괜찮습니다! 학습 효율이 조금이나마 올라갔을 거라 믿습니다.

 

이상 회고 마치겠습니다!!

 

 

 

2/28 11:00 소식 추가!

1차 합격!!

 

1차 합격했네요..!! 2차도 방심하지 않고 잘 준비해보겠습니다 :)