안녕하세요! NewCodes입니다!
이번 네이버 부스트캠프 9기에 지원했습니다!
자기소개서와 포트폴리오를 열심히 작성하고~~
1차 코딩테스트를 봤습니다!
2024년 6월 15일에 진행한
네이버 부스트캠프 1차 코딩테스트(문제 해결력 테스트)
회고를 해보겠습니다!
📌 네이버 부스트캠프 1차 코딩테스트 참고사항
- 응시 언어: 자바 (언어 제약 크게 x)
- 문제 수: 10문제 (CS 6문제 + 구현 3문제 + 서술형 1문제)
- 시간: 2시간 (14:00 ~ 16:00)
- 감독: 무감독
- 환경: 구름
- 제약 조건
- 인터넷 검색 가능, 개인 자료 참고 불가능
- A4 종이 3장 및 필기펜 가능
- 시험 페이지 및 검색 페이지 외 모든 프로그램 종료
- 투명한 생수 가능
👨🏻💻 1차 코딩테스트에 대하여
: 난이도는 전반적으로 쉬웠습니다. 물론 코딩이 처음인 사람은 어려웠겠지만, 다른 코테 준비했었던 사람이라면 다들 쉽게 느꼈을 것 같습니다. 감독 또한 존재하지 않아서 큰 변별력을 둔 시험은 아닌 듯합니다.
문제는 총 10문제가 나왔습니다. CS 객관식 6문제, 구현 3문제, 서술형 1문제가 출제됐습니다. 결과는 확실히는 모르겠지만, 우선 10문제 자신감있게 다 풀었습니다.
이번에 문제가 어떻게 나왔는지에 대해서부터 간략히 정리해보겠습니다. (규정 상 자세히는 언급하지 않고자 합니다. 문제의 소지가 있다면 언제든지 삭제하겠습니다.)
CS 문제 특징 정리
- 총 6문제, 4지선다 객관식
- 기본적인 사고력이 있는지, 주어진 코드를 이해할 수 있는지를 물어보는 문항들이었음
- 작년 후기들에 비하면 많이 쉽게 나온 편
- 'CS 문제'라고 하기 보다는 '기초 사고력 문제'(?) 정도로 부르는 게 맞는 듯
- 난이도가 쉬웠다고 한들, 꼼꼼히 선지 따지지 않으면 실수로 틀릴 법한 문제도 있었음
구현 문제 특징 정리
- 총 3문제 + 서술형 1문제
- 메서드 기본적인 틀 주어지고 핵심적인 부분만 작성하도록 요구함
- 반복문, 조건문, 자료구조 기본만 알아도 3문제 모두 풀 수 있는 수준
- 한 문제에 대해서는 서술형으로 코드를 어떻게 짰는지 물어보는 문항 있었음
✅ 구현 1번
- 유형: 구현
- 난이도: 실버 하위
- 풀이 시간: 19분(풀이) + 7분(서술형)
- 선택 언어: Java
: 크게 언급할 부분이 없습니다. 반복문과 조건문을 다룰 줄만 안다면 풀 수 있는 문제였습니다. 서술형은 코드를 작성하기까지의 과정을 물어보는 문항이었습니다.
✅ 구현 2번
- 유형: 구현
- 난이도: 브론즈
- 풀이 시간: 9분
- 선택 언어: Java
: 이 또한 반복문과 조건문을 다룰 줄만 안다면 풀 수 있는 문제입니다.
✅ 구현 3번
- 유형: 구현(자료구조, 정렬)
- 난이도: 실버 상위
- 풀이 시간: 40분
- 선택 언어: Java
: 시간이 제일 오래 걸린 문제였습니다. 문제 자체는 복잡하지 않았고 설계하는 데 문제는 없었지만, 막상 코드로 작성하는 게 오래 걸렸습니다. 여러 방법으로 풀 수 있을 것 같은데 저는 자료구조 HashMap을 사용해서 풀었습니다.
LinkedHashMap을 사용하기도 했고, 이를 어떻게 정렬하는지는 기억이 안 나서 인터넷 검색을 하며 풀었습니다. 이에 대해서는 따로 정리를 해봐야겠네요.
🧐 새롭게 알게 된 점
1. [클린코드] 메서드 순서에 대하여
: 이번 구현 문제들을 메서드의 틀이 어느 정도 작성되어 있고, 비어있는 메서드를 구현하는 방식이었습니다. Java로 작성된 메서드를 살펴봤더니 main 메서드가 제일 아래에 있고, 그 나머지 메서드는 main 메서드 위에 작성되어 있었습니다.
public class Solution {
public static void main(String[] args) {
// main 메서드에서 다른 메서드 호출
printHello();
int result = addNumbers(5, 10);
System.out.println("Result: " + result);
}
// main 메서드 아래에 다른 메서드들을 선언
public static void printHello() {
System.out.println("Hello, World!");
}
public static int addNumbers(int a, int b) {
return a + b;
}
}
위 예시처럼 저는 그 동안 코테를 풀며 항상 main 메서드를 제일 위에 두고, 그 아래에 제가 정의한 메서드들을 배치했습니다. 하지만 이번 코테에서 주어진 코드는 main 메서드를 제일 아래에 두고, 그 위에 새롭게 정의한 메서드를 배치하길래 이에 대해 알아봤습니다.
우선 오라클 자바 공식 문서에서는 메서드끼리의 순서에 대해서는 다음과 같이 언급합니다.
These methods should be grouped by functionality rather than by scope or accessibility.
For example, a private class method can be in between two public instance methods.
The goal is to make reading and understanding the code easier.
기능적으로 메서드들을 응집하는 게 중요하다고 합니다. 그리고 목표는 코드를 읽고 이해하기 더 쉽도록 만드는 것이라고 합니다. 이 목표에 근거해서 보면 저는 main 메서드가 제일 위에 있어야 한다고 생각합니다.
그 이유는 해당 방법이 코드의 동작을 이해하기 쉽게 하는 데 적합하다고 생각하기 때문입니다. main 메서드에서 어떤 메서드들이 호출되는지 거시적으로 먼저 구조를 살펴보며 큰 그림을 그릴 수 있습니다. 이후, main에서 호출되었던 메서드를 자세히 살펴보며 이해를 도모할 수 있습니다.
그런데 이는 main 메서드가 포함된 '실행 클래스'일 때를 한정해서 논한 것입니다. 실제 코드에서는 실행 클래스에서 여러 다른 메서드를 따로 선언하지 않기에 크게 문제가 되지는 않을 것입니다.
물론 네부캠에서 main 메서드를 제일 아래에 제시하고, 응시자가 작성해야 할 메서드를 제일 위에 배치한 배경은 '문제에서 중요한 걸 앞에 두고자 함'이지 않을까 싶네요.
메서드 순서가 어떻게 보면 사소한 부분이긴 하지만, 그래도 덕분에 배운 게 있습니다. 여러 메서드가 있을 때 '기능적인 측면에서 메서드를 응집'해야 한다는 걸 배우고 가네요!
2. [Java] LinkedHashMap 정렬
: 저는 실전에서 LinkedHashMap을 아래와 같은 방법으로 정렬해서 풀었습니다. 물론 아래 방법 외에도 여러 방법이 존재합니다.
import java.util.*;
public class Example {
public static LinkedHashMap<String, String> sortMapByValue(Map<String, String> map) {
List<Map.Entry<String, String>> entries = new LinkedList<>(map.entrySet());
Collections.sort(entries, (o1, o2) -> o1.getValue().compareTo(o2.getValue()));
LinkedHashMap<String, String> result = new LinkedHashMap<>();
for (Map.Entry<String, String> entry : entries) {
result.put(entry.getKey(), entry.getValue());
}
return result;
}
public static void main(String[] args) {
Map<String, String> map = new LinkedHashMap<>();
map.put("Nepal", "Kathmandu");
map.put("United States", "Washington");
map.put("India", "New Delhi");
map.put("England", "London");
map.put("Australia", "Canberra");
Map<String, String> result = sortMapByValue(map);
for (Map.Entry<String, String> entry : result.entrySet()) {
System.out.println("Key: " + entry.getKey() + ", "
+ "Value: " + entry.getValue());
}
}
}
https://codechacha.com/ko/java-sort-map/
그러나 문제 요구사항 상 결론적으로 보면 해당 문제에서 LinkedHashMap을 사용하지 않고 HashMap을 사용해도 됐습니다.
저는 그 동안 LinkedHashMap을 '순서'가 있는 Map이라고 뭉뚱그려 이해했습니다. 하지만 LinkedHashMap의 주된 컨셉은 '입력된 순서'대로 그 요소를 저장하는 것입니다. 그리고 이러한 요소들을 '정렬'하기 위한 메서드를 따로 제공하지 않습니다.
이제는 LinkedHashMap '입력된 순서'대로 저장하는 자료 구조라고 더욱 구체화해서 기억해둬야겠습니다!
⭐️ 피드백
- 다음 시험은 훨씬 더 어려워질 것 같다! 방심하지 말고 빡세게 준비 이어나가자!!
- 코테 보기 전, 오전에 푹 쉬면서 낮잠도 자며 컨디션 올린 점 좋았다!
- 메서드 순서 배치에 대해서는 '기능적으로 응집'하는 데 초점을 두자!
- 자바의 Map 종류 정리
- HashMap: Key와 Value
- LinkedHashMap: 입력된 순서로 요소 저장
- TreeMap: 키를 기준으로 정렬된 맵 (Comparator 통해 정렬 기준 설정 가능)
- HashTable: 동기화된 메서드 제공
- ConcurrentHashMap: 멀티스레드 환경 최적화
'회고 > 코딩테스트 회고' 카테고리의 다른 글
[네부캠] 네이버 부스트캠프 9기 - 2차 코딩테스트 회고 (0) | 2024.07.06 |
---|---|
토스페이먼츠 3년 이하 서버 개발자 챌린지 - 서류 및 코딩테스트 합격 회고 (4) | 2024.05.12 |
[우테캠] 우아한테크캠프 7기 - 2차 과제테스트 회고 (0) | 2024.04.22 |
[우테캠] 우아한테크캠프 7기 - 1차 코딩테스트 회고 (2) | 2024.04.14 |
소프트웨어 마에스트로 15기 - 2차 코딩테스트 회고 (0) | 2024.03.03 |