Search

[SSAFY] B형 합격수기

생성일
2023/03/13 06:34
태그
회고
날짜
2023/03/14
3 more properties

삼성 S/W 역량테스트 B형 수기

3월 4일 토요일 역삼 멀티캠퍼스에서 java를 이용하여 역량테스트 B형 시험을 봤고, 10일에 메일을 통해 합격 결과를 통보받았습니다. 이번이 첫 응시라 제한적인 정보일 수는 있지만, 제가 B형 시험을 준비하며 느꼈던 점들과 앞으로 B형을 응시하는 데 도움이 될만한 팁들을 정리해 보았습니다.

시험 준비 내용

B형 특강

현재 싸피에서는 B형 응시 희망자를 대상으로 특강을 제공하고 있습니다. 특강에서는 매주 특정 주제로 개념을 설명한 뒤 문제풀이를 해 주시는데, 매주 한 문제는 B형 시험에 출제되는 문제와 형식이 비슷합니다(기출문제인 것 같기도 합니다). 이러한 문제들을 풀면서 B형의 문제 스타일과 코드 작성 형식에 익숙해진 것이 합격에 큰 도움이 된 것 같습니다.

자료구조

SWEA에서 문제를 풀면서 B형 문제들이 특정 알고리즘을 알아야만 풀 수 있는 문제보다, 자료구조에 대한 이해를 바탕으로 효율적인 구현을 요구하는 문제를 출제한다고 생각했습니다. 그래서 어려운 알고리즘보다는 여러 자료구조들에 대해 다음과 같은 기준을 두고 공부했습니다.
1.
해당 자료구조의 특징을 이해할 수 있다.
→ 싸피 알고리즘 수업, 추가 개념 공부
ex) binary tree (이분 탐색)는 정렬된 상태에서 빠르게 쿼리가 가능하다
2.
어떤 상황에 사용하면 유리한 지 빨리 판단할 수 있다.
→ 자료구조마다 최소 10문제 이상 문제 풀이, 다른 사람 코드 보고 한 번 더 배우기
자료구조의 장점과 문제에 응용되는 상황에 익숙해지기
ex) 힙은 삽입이 빈번히 이루어 지며 최대 최소값을 자주 접근해야할 때 유리하다
3.
자료구조를 직접 구현할 수 있다.
a.
→ 라이브러리 없이 구현
b.
ex) graph, linked list, deque, heapq, binary index tree, …

공부 순서

공부 순서: 자료구조 → 알고리즘 → 구현
개념을 이해하고 체득하는 게 중요한 것 같습니다. 저는 파이썬이 주 언어고, 자바는 싸피에 입과해서 처음 접했습니다. 실제 시험에서 때 짧고 간결하게 코드를 짜는 것은 쉽지 않았지만 개념을 잘 정리해둬서 논리적으로 작성하는 데는 문제가 없었던 것 같습니다.

검정 당일

시험 시간은 총 4시간인데, 시험 30분 전부터 OT가 있기 때문에 시험 시작 전 40분 전까지 입실해야 했습니다. 시험 치다보면 목이 마르니 생수 한 병 챙기시는 걸 추천드립니다. 주의할 점은 커피는 가지고 입실이 불가능했습니다. 시험 첫 1시간은 화장실 이용도 불가능하니, 미리 오셔서 시험 전 준비하시는 게 좋습니다.

문제 풀이 전략

1.
문제를 처음 만났을 때 구현 자체가 쉽지 않겠다는 생각이 들었습니다. 그래서 주어진 예시를 완벽히 이해하려고 손으로 그림을 그려가며 문제에서 발생할 수 있는 상황들을 이해하려고 했습니다.
2.
구현에 대한 그림이 그려진 후 효율적으로 수행할 수 있는 알고리즘과 자료구조를 선택했습니다. 이번 시험에서는 최대힙과 최소힙을 동시에 사용하였습니다.
3.
생각대로 구현했을 때 메서드마다 제한 조건에 대해 메모리초과나 시간초과가 날 지 복잡도 분석을 간단히 진행했습니다.
4.
추가적으로 발생할 수 있는 Corner Cases에 대해 생각해보고 나서 실제 구현에 들어갔습니다.
실제 시험 시간은 4시간이지만, 의미 있는 코드를 작성한 시간은 30분에서 1시간 정도였습니다. 코드를 작성하는 시간보다 처음 고민에 훨씬 많은 시간을 할애했던 것이 좋은 선택이었던 것 같습니다. 놀랐던 건, 시험 시작 후 5분도 지나지 않아 타자소리가 점점 커졌는데, 제가 코드를 작성하기 시작할 때는 키보드를 두드리는 소리가 거의 들리지 않았습니다. 실력이 문제 난이도에 비해 월등하지 않은 이상, 설계 없이 작성한 코드는 버려질 가능성이 있고, 제 생각에 B형 문제는 더더욱 그런 것 같습니다.

시간 제한조건 확인 팁

문제를 푸셨다면, 제한조건을 확인하기위해 제가 사용했던 방법이 도움이 될 지 모르겠습니다. 시험에서 주어진 테스트 케이스와 평가를 위한 케이스는 다릅니다(정확한 수치는 아래와 다를 수 있습니다).
예를 들어,

문제 조건

50개 테스트 케이스 모두에 대해 2초 이내에 실행
총 함수 실행 횟수가 케이스당 1만회 이하

주어진 조건

10개의 테스트케이스
이런 경우 10개의 테스트 케이스에 대해 실행해보고 실행 시간(메모리도 마찬가지)을 파악할 수 있습니다. 만약 10개의 테스트케이스를 여러번 돌려본 결과 0.3초 이내에는 실행됨을 확인했다고 하면
‘그럼 10개에 0.3초니, 50개면 0.3×(50/10)=1.50.3 \times (50/10)=1.5초로 2초 안에 실행 되겠다’
라고 생각하면 막상 결과를 받았을 때 테스트를 통과하지 못할 가능성이 있습니다. 제가 사용한 방법은 다음과 같습니다.

그럼 어떻게?

1.
주어진 샘플 테스트 케이스 파일을 메모장으로 열람한다. (보통 input.txt라는 이름으로 주어진다)
2.
메모장 우측 한단에 몇 줄인지 파악한다. (예를 들어 5만줄이라고 해보자)
3.
해당 파일이 최악의 경우 몇 개의 테스트 케이스인지 파악한다.
이는 (줄 수) / (최대 함수 호출 횟수) 로 계산한다. 위의 경우 (5만) / (1만) = 5
4.
해당 기준으로 제한 조건인 50개의 테스트케이스 2초라는 조건에 대입해본다.
‘그럼 10개 5개에 0.3초니, 50개면 0.3×(50/5)=30.3 \times (50/5)=3초로 2초 안에 실행 되겠다 되지 않겠다
이렇게 하는 이유는 테스트 케이스는 말 그대로 디버깅을 위한 용도이기 때문에 굉장히 간단한 경우도 주어지기 때문입니다. 이런 경우를 전부 제외하고 극악의 케이스로만 50개를 구성해도 통과하도록 해야합니다. 저같은 경우는 최악의 경우 50개를 돌렸을 때 제한조건의 절반인 1초 이내에 실행된다는 계산이 나와서 효율성을 통과할 것이라 생각했습니다.

마무리

알고리즘 공부를 할 때는 성과도 없고 실력이 느는 것도 잘 느껴지지 않는데, 시험이라는 관문을 통과하니까 스스로 늘고 있는 것이 느껴지는 것 같아 의미있는 것 같습니다. B형을 준비하는 여러분들이 다음 시험에 좋은 결과가 있기를 응원하겠습니다!