삼성 SW 역량 테스트 및 A형 시험 자체에 대한 정보를 얻고 싶으신 분은 아래 링크를 클릭해 주세요.
시험 정보 글로 이동
관련 추천 도서에 대한 정보를 얻고 싶으신 분은 아래 링크를 클릭해주세요.
----------------------------------------------------------------------------------------------
- 이 글은 삼성 A형 혹은 SW역량테스트를 준비하는 사람들에게 도움이 되고자, 공부법에 대한 개인적인 의견을 담은 글입니다.
- 다소 미흡한 점이 있는 글이거나 오래된 정보를 담고 있는 글이 될 수 있지만, 점진적으로 글을 수정하면서 보완해나갈 예정입니다.
- 이 글은 [2020-02-20]에 마지막으로 수정되었습니다.
----------------------------------------------------------------------------------------------
단단한 실력 쌓기!
A형 문제가 뭐 커트라인이 어떻건 간에 우리에게 중요한 마음가짐은 A형 시험에 맞는 어떠한 난이도의 문제가 나오든, 1문제가 나오든 2문제가 나오든 간에 3시간 안에 완벽하게 풀어낼 수 있는 실력을 갖추는 것이 가장 중요하겠지요?
공채 시험의 경우, 합격 커트라인은 지원하는 사업부나 부문, 그리고 같이 지원하는 사람들의 실력과 수에 따라서 조금씩 달라질 수 있으니까요.
이제 제가 추천하는 공부법을 알려드리도록 하겠습니다.
보통 일반적으로 시험을 준비하는 사람들은 제일 처음하는 것 중 하나가 있습니다.
바로 기출문제를 보는 것이죠!!
이러한 기출문제 / 예상 문제 / 비슷한 유형 문제들은,
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV4suNtaXFEDFAUf
이런 것도 있고요,
이런 것도 있습니다.
위 사이트 자체가 삼성전자에서 SW역량이 뛰어난 사람들을 뽑기 위해 만든, 사이트이며 공부를 하라고 제공해주는 사이트입니다.
그리고 백준에서 SW역량테스트 기출문제라고 검색을 하시면 복원 문제들이 많이 나타납니다.
(시험을 칠 때에는 문제를 유출하지 말라고 아마 경고문이 있을 것인데, 알게 모르게 많이 유출이 되었죠 ㅠ)
그래서 기출문제를 보고 공부를 하라~ 라는 말을 하실줄 아셨겠지만, 저는 조금 다릅니다.
잠시 비유를 들어 보자면, 저희는 초/중/고등학교 교육을 받고 수능을 보게 됩니다.
그렇다고 초등학생이 처음 수능 기출문제를 풀어보면서 공부를 하지는 않지요. 고등학생이라면 기출문제를 열심히 돌릴때가 맞기는 하지만요.
이미 알고리즘 문제를 풀거나 코딩을 예전부터 즐겨 하시거나, 어렸을때 정보올림피아드를 해보셨거나, 코딩대회에서 상을 타시고 하시는 이런 이미 내공이 출중하신 분들은 이미 고등학생이나 대학생 이상의 수준이라서, 기출문제를 심심풀이로 몇개 풀어보시고 시험을 치시면 간단하게 합격 하실 수 있으실 겁니다.
하지만 아마 이 글을 보고 계신 분들은 다양한 실력의 스펙트럼을 가지고 계시겠지만, 방금 언급한 능력자분들일 가능성은 조금 낮다고 생각합니다. (팩트폭행 죄송합니다)
따라서 요점은, 자신의 수준에 맞는 난이도의 공부 자료로 공부를 해야지 의욕을 잃지 않으면서 꾸준히 공부하기에 좋을 것이라고 생각합니다.
저자의 추천 공부 커리큘럼
그래서 제가 추천하는 커리큘럼은 다음과 같습니다. 그리고 이 글에서는 2~3단계에 대하여 공부하는 분들에게 필요한 추천 리소스와 방법들을 제공합니다.
1-1. 프로그래밍 언어에 익숙해지는 단계
- 만약 본인이 이 단계에 해당한다면, 아마 컴퓨터공학과 1학년 학부생이거나, 코딩 공부를 막 시작한 비전공자에 해당할 것입니다. 이 단계에서 공부하는 부분은 안타깝게도 이 글에서는 설명하지 않습니다.
1-2. 기초적인 자료구조와 알고리즘을 배우는 단계
대학교 컴퓨터공학부 2학년쯤에 배우는 자료구조 및 알고리즘 수업에서 배우는 것들을 한번 배워보는 단계에 해당합니다. 기본적인 자료구조로 스택, 큐, 링크드 리스트 등은 기본적으로 알아야 하며, 시간 및 공간 복잡도 개념과 점근적 표기법에 대하여 알아야 합니다. 그리고 그래프 탐색 알고리즘인 DFS, BFS에 대하여 알아야 하고, 완전탐색 및 백트래킹에 대하여 알면 좋습니다.
또한 비트연산자와 컴퓨터에서 정수 및 실수를 어떻게 표현하는지, 등의 개념도 숙지하고 있으면 좋습니다.
이러한 내용들을 모르시는 분들은 이 글 외의 자료를 찾아서 공부해보시길 추천드립니다.
이 단계에서 "도움이 될 수 있는 책"에 대해 추천드립니다.
2-1. 초급 난이도에 해당하는 다양한 문제들을 풀어보는 단계
○ 추천하는 문제 풀들
> 정보올림피아드 초등부 문제들
> 코드포스 문제들
2-2. A형과 출제 범위, 난이도 및 유형이 비슷한 문제들을 풀어보는 단계
- 하단에 관련 문제 목록들을 올려놓았습니다.
3. 시험장 분위기에 익숙해지는 단계
- 이 단계는 이미 실력적으로는 A형을 맞출 수 있는 단계라고 생각합니다.
- 다만 이 단계에서는 오프라인에 3시간이라는 제한시간이 있는 시험 환경에 익숙해지는 훈련이 필요합니다.
- 잘 하는 사람이라도, 긴장하거나 하면 알던 문제도 실수하고 해법이 떠오르지 않거나 하거든요.
프로그래밍 언어에 익숙해지는 단계에 있는 분이 공부하는 법에 대해서는 이 글에서는 설명하지 않겠습니다.
(이 글을 보시는 모든 분들이 1-1단계는 모두 지났다고 가정하고 설명을 드리겠습니다.)
1-2단계 "기초적인 자료구조와 알고리즘을 배우는 단계"의 공부법
원래 이 단계의 공부법은 따로 언급하지 않으려고 했으나, 좀 더 다양한 분들에게 도움이 되는 글이 되기 위해서 이 부분을 작성을 해 볼까 합니다.
이 부분은 일반적인 컴퓨터공학과를 전공한 학생이 1,2학년때 수강하게 되는 "자료구조", "알고리즘" 수업 범위에 해당하는 부분입니다.
이 단계에서 반드시 이해하고 넘어가야 하는 개념들의 키워드를 나열해 놓을 테니, 관련 개념에 대하여 학습한 뒤 어느정도 이해도가 충족 되면 다음 단계인 2단계로 넘어가시면 좋습니다.
필수 학습 개념들
- 알고리즘의 시간 복잡도(Time Complexity) 및 공간 복잡도(Space Complexity) 개념 및 점근적 표기법(Asymptotic Notation)
- 컴퓨터 기초 - Bit연산과 정수 및 소수 표현(Bit manipulation)
- 프로그래밍 언어 기초 - 재귀함수(Recursion function)
- 자료구조 - 스택(Stack)
- 자료구조 - 큐(Queue)
- 자료구조 - 트리(Tree)
- 자료구조 - 그래프(Graph)
- 알고리즘 - 그래프 탐색 알고리즘(DFS:Depth First Search)
- 알고리즘 - 그래프 탐색 알고리즘(BFS:Breadth First Search)
- 알고리즘 - 완전 탐색(Brute-force / Exhaustive Search)
추가적으로 학습하면 좋은 개념들
아래 나오는 항목들은 필수적인 항목들은 아니지만, 잘 알고 있으면 A형을 안정적으로 취득할 수 있도록 도와주는 개념들입니다.
- 알고리즘 - 백트래킹(Backtracking)
- 구현 팁 - Run-Length 인코딩
- 구현 팁 - 비트마스킹(Bitmasking)
- 알고리즘 - 다익스트라 최단경로 알고리즘(Dijkstra shortest path algorithm)
- 알고리즘 - 다이나믹 프로그래밍 기초(Dynamic programming)
- 개념, 팁 - 상태 모델링(State Modeling)
- 라이브러리 - C++ STL(Standard Template Library) 중 vector, queue, sort, priority_queue 등
- 자료구조 - 우선순위 큐
- 알고리즘 - 이진 탐색(Binary search)
2-1단계 "초급 난이도에 해당하는 다양한 문제들을 풀어보는 단계" 공부법
우선은 2-1에 해당하는 "초급 난이도에 해당하는 다양한 문제들을 풀어보는 단계"를 진행하시기를 추천드립니다.
"다양한 문제들 + A형 문제와 출제 유형 등이 비슷한 문제들" 등을 풀면서 공부를 하면 됩니다.
출제 유형이 비슷한 문제들만 푸는 것이 아닌, 다른 다양한 문제들도 많이 풀으라고 권장을 드리는 이유는
크게 두가지가 있습니다.
1. 다른곳에서도 통하는 실력
- 다양한 문제를 풀이하면서 쌓은 실력은, 삼성전자 입사를 위한 SW역량테스트/상시테스트 뿐만 아니라 다른 회사를 입사하기 위한 알고리즘 테스트/코딩테스트 및 각종 알고리즘 대회 등에도 도움되는 역량입니다. 물론 원하는 회사에 입사하는 것도 중요하지만, 다른 회사로 가는 가능성도 열어두면 나쁠것은 없겠죠?
-> 특히나 삼성 SW역량테스트의 문제 유형은 고정된 것 같지만, 시간이 지날 수록 유형이 조금씩 변화하는 모습도 보이기도 합니다. 따라서 기출문제 풀이에만 안주하기 보다는 꾸준히 공부하는 것이 더 안정적입니다.
2. SW 문제풀이 실력의 안정성 향상
- 출제 유형에만 맞는 문제를 풀이하다 보면, 해당 유형에 맞지 않는 문제를 보았을 때 맞출 확률이 현저히 떨어지게 됩니다. 또한 풀줄 아는 것 만 풀다 보면 문제를 조금만 꼬아서 내도 크게 당황하게 되지요. 따라서 같은 A형 문제를 보더라도 언제는 맞추고 언제는 틀리는 실력을 갖기 보다는, 항상 문제를 풀어낼 수 있는 실력을 갖추는 것이 중요합니다. 이러한 안정적인 실력을 갖추기 위해서는 다양한 문제들을 풀어보는 것이 도움이 많이 됩니다.
또한 이러한 실력이 쌓이게 되면, 자신감도 같이 붙게 되기 때문에 시험장에서 긴장도 덜 하게 됩니다.
저는 이러한 문제들 중 일단은 "다양한 문제들"에 해당하는 문제 풀을 추천드리려고 합니다.
이러한 문제중에서는 일단은 특히나 정보올림피아드 초등부 문제들을 추천합니다.
백준저지에 가시면 문제들이 거의 다 올라와있는데요, https://www.acmicpc.net/category/55
96년도부터 2018년도까지만 다 풀어도 23개년어치입니다. 매년 3~4문제 정도가 있으니, 대충 100문제가 안되는 수의 문제들입니다.
이제 정올 초등부 문제를 추천하는 이유들을 나열해보겠습니다.
난이도가 단계적이다
각각의 기출들은 3~4문제로 이루어져있는데 문제가 1,2,3,4 번이 있다면 난이도는 1 < 2 < 3 < 4 식이고, 4번 문제 쯤 되면, 솔직히 SW역량테스트보다 난이도가 어려운 경우도 있다고 생각합니다.
처음 풀다보면 1번 문제만 풀 수 있다가, 공부를 함에 따라서 2번도 풀었다 못풀었다 하기도 하고, 나중에는 1~2번 문제는 껌으로 풀고 3번문제를 풀었다 못풀었다 하고 하는 식으로 실력이 느는 것을 체감하기에도 쉽지요.
SW역량 테스트를 쉽게 통과하려면 3번문제까지는 쉽게 풀고 4번 문제는 가끔 풀 수 있는 실력정도는 되어야 한다는 개인적인 의견이 있습니다.
문제 출제 범위가 SW역량 테스트와 비슷하다.
정보올림피아드 초등부의 경우는 간단한 수학문제, 구현(시뮬레이션), 완전탐색(DFS, BFS), 간단한 DP 및 그리디 정도가 출제 범위입니다. 중고등부로 넘어가게되면 세그먼트 트리와 같은 고급 자료구조와, 유량 문제 등이 등장하게 되는데 이는 SW역량 테스트의 출제 범위와 한참 벗어나 있습니다. 절대 안나온다는 뜻이죠.
SW역량 테스트의 경우는 완전탐색과 구현(시뮬레이션) 문제에서 99% 나온다고 보실 수 있습니다. 출제 범위가 참 비슷하지요?
SW역량테스트에 비해 문제 푸는 피로도가 덜하다
A형에서는 조금 체감이 덜 될 수도 있는데, 정보올림피아드 문제들은 SW역량테스트에 비해서 사람을 귀찮게하는 요소들이 좀 덜한 편입니다. 문제 하나하나 풀 때 마다 체력 소모가 크다면, 계속해서 공부해야하는 입장에서 빨리 지치겠지요? 정보올림피아드 문제가 좀 더 가벼운 느낌으로 재미있게 풀면서 코딩 스킬 / 알고리즘 스킬 / 컴퓨팅 사고 능력을 기르기에 적합합니다.
공인된 문제 + 적절한 퀄리티 + 쉽게 구할 수 있는 풀이 + 공개된 TestCase
공인된 문제므로 일정 이상의 퀄리티는 나올것이며, 유명한 문제이니 만큼 풀이도 쉽게 구할 수 있는 것은 자명합니다.
그리고 정올 사이트 (http://www.jungol.co.kr/)에서 기출문제 탭에서 문제를 풀게 되면, 틀린 TestCase도 직접 눈으로 확인해볼 수 있습니다. 백준에서 공개되지 않는 TestCase를 보고 맞왜틀(맞은것 같은데 왜 틀리죠?) 맞왜틀 노래를 부르는 것 보단 훨씬 도움이 될만한 자료가 많다는 것을 알 수 있습니다.
정공법 공부에 가깝다
이 이야기는 무슨 이야기냐 하면, 사실 코딩 / 알고리즘 문제 풀이를 잘 하려면 문제를 많이 풀어봐야 합니다. 기출문제만 푸는 식으로 공부를 하면 조금 꼬아서 내는 구현형 문제가 나왔을때 당황을 하거나 하는 경우가 많죠. 즉 비슷한 난이도의 문제인데, 어떨때는 풀 수 있고 어떨때는 못 푸는 경우, 사실은 그 난이도의 문제를 정ㅋ벅ㅋ 한 것은 아니란 것이죠. 정보올림피아드 초등부 문제를 다 풀어보고 이해하고 내것으로 만들 정도의 공부량이면 SW역량 테스트는 정ㅋ벅ㅋ 가능할 것 이라는 개인적인 사견이 있습니다. 최소 이정도 난이도에 이정도 개수의 문제는 풀어봐야 단단한 실력을 갖는다 라는 생각이지요.
반드시 이해하고 넘어가세요
사실 23개년 문제 4문제씩은 많은 양이 아닙니다. 따라서 못푸는 문제의 풀이를 듣게 되면 열심히 이해해서 본인 것으로 만들어 주세요. 당연한 이야기 같기도 합니다. 코딩을 단순히 많이 한다고 느는 것이 아니라, 중고등학교때 수학문제를 풀듯이 하나하나 제대로 이해하고 넘어가고, 문제를 풀기 위해 사고하는 과정에서 많이 성장하는 것입니다.
2-2단계 "A형과 출제 범위, 난이도 및 유형이 비슷한 문제들을 풀어보는 단계" 공부법
2-1단계에서 초급문제들을 풀어가면서 어느정도 실력을 쌓았다면, 이제는 A형 유형과 더 비슷한 문제들을 풀어줍니다.
많이 풀 수록 좋기도 하겠지만, 2-1단계에서 탄탄한 실력을 쌓았다면 문제 하나하나 풀어보면서 A형 문제 스타일을 음미한다는 느낌으로 풀면서 즐겨주세요.
2-2단계에 해당하는 문제들이 처음에는 조금 낯설수는 있지만 몇개만 풀어봐도 금방 익숙해지고 풀만하다는 느낌이 든다면, 2-1단계에서 공부가 잘 된 것입니다.
관련 문제들을 계속해서 풀어봐도 막막하고, 풀이를 봐도 매우 이해하기 힘들다면 2-1단계로 다시 돌아가시는게 좋습니다.
2-2단계에서 풀만한 추천 문제들은 아래에 있습니다.
A형에서 주로 나오는 문제 유형은 대부분 모든 경우의 수를 다 찾아보는 완전탐색(Exhaustive Search 혹은 Brute-Force Algorithm이라고도 합니다)문제와 하나하나 그대로 따라해보는 시뮬레이션 문제, 그리고 고급 알고리즘 보다는 코딩 구현 능력을 필요로하는 구현형 문제들이 많이 나옵니다.
동적 계획법(Dynamic Programming)문제들은 거의 나오지 않고, 동적 계획법으로 풀 수 있는 문제가 나올 수는 있지만, 그 문제는 완전탐색으로도 풀 수 있는 문제일 것입니다.
> BFS
> DFS
> 시험과 비슷한 유형 문제들
http://boj.kr/14888 연산자 끼워넣기 / 풀이
http://boj.kr/14889 스타트와 링크 / 풀이
http://boj.kr/16235 나무 재테크 / 풀이
http://boj.kr/17135 캐슬 디펜스 / 풀이
http://boj.kr/17406 배열 돌리기 4 / 풀이
http://boj.kr/17471 게리맨더링 / 풀이
http://boj.kr/17472 다리만들기 2 / 풀이
3단계 "시험장 분위기에 익숙해지는 단계" 공부법
마지막 단계입니다. 오히려 2-2단계까지는 잘 마무리하고 나서 3단계에서 잘 안되어서 떨어지곤 하는 경우가 꽤 있을 수 있다고 생각합니다.
실제로 제 주변 지인중에는, 충분히 A형을 취득할만한 실력이 된다고 생각되는 분인데 A형이나 SW역량테스트에서 떨어지곤 하는 모습을 본 적이 있습니다.
이는 오프라인 시험이라는 환경에 익숙치 않고 자신감이 떨어져 있는 상태라서 그런 경우가 많다고 생각합니다.
A형시험과 SW역량테스트는 3시간짜리 제한시간이 있는 시험이고, 평소에 코딩하지 않는 환경에서 이루어지는 오프라인 시험입니다.
특히나 SW역량테스트 같은 경우에는 "이번에 시험에 떨어지면 다시 6개월간 다시 준비해야 한다"라는 압박감 때문에 과도한 심리적 위축이나 긴장이 생길 수 있습니다.
특히나 이런 상태에서 조금 난해한 구현형식의 문제나, 처음 보는 것 같은 유형의 문제가 나타나게 되면 크게 당황하게 되고 패닉상태에 빠집니다.
심호흡을 하고 한번 더 생각해보면 실수하지 않을 것도 심리적인 이유로 실수를 해버리거나, 머릿속이 하얗게 질려버려서 해법이 떠오르지 않을 수 있죠.
그럴 때 일 수록 다시한번 생각해 보고 마음을 가다듬어야 합니다. 하지만 이 방식은 시험장에서 사용해야 하는 방법이고, 시험 전이라면 이런 부분을 좀 더 연습을 해 보아야겠죠.
이러한 부분에 있어서 저자가 추천하는 방법이 있습니다.
바로 코드포스 컨테스트에 참여하는 것입니다. (http://codeforces.com)
이게 왠 쌩뚱맞은 소리인가 싶을 수도 있지만, 일단 제 경험에 비추어서 설명드리겠습니다.
코드포스는 러시아에서 운영하는 온라인 코딩대회 플랫폼이라고 보시면 됩니다. 월 6회 정도 온라인 콘테스트를 여는데요, 보통 2시간 정도 콘테스트가 진행됩니다.
이 콘테스트도 제한시간이 있으니 이 시험을 수능 모의고사 마냥 푼다고 생각하고 집에서 컴퓨터 주변을 정돈하고 마음을 가다듬은 뒤 콘테스트에 참여 해 보는겁니다.
시간제한이 있는 시험환경을 몇 번 경험해보면서 마인드 컨트롤하는 능력을 기르는 것이지요.
특히나 코드포스의 경우는 콘테스트를 참여할때 제출을 할 시 Pretest Passed나 Wrong Answer과 같은 피드백을 주는데,
Pretest Passed라고 하더라도, 콘테스트가 끝난 뒤 System Test를 했을 때 틀리는 경우가 있을 수 있습니다.
Pretest에 사용되는 TestCase가 허술하기 때문이지요.
따라서 본인이 정확한 알고리즘을 딱 내서 제출할 수 있는 실력이 되어야지 안정적으로 문제를 풀고 점수를 가져갈 수 있습니다.
저는 실제로 코드포스를 하면서 초반에는 적당히 될 것 같은 알고리즘으로 짜서 냈다가, System Test에서 계속 틀리는 것을 확인하고, 좀 더 정확하고 꼼꼼한 알고리즘을 설계하는 습관이 생겼습니다.
그리고 시간 제한이 있는 컨테스트를 해 보면 그 시간만큼은 확실하게 집중하게 됩니다.
일단 한번 참여해보는 것을 추천드립니다.
그리고 길고 장황한 글 다 읽으시느라 고생하셨고, 만약 이 글이 도움이 되셨다면 공감과 댓글 하나씩만 남겨주세요.
'알고리즘 & Problem Solving' 카테고리의 다른 글
회사에서 채용시 알고리즘 문제해결능력을 강조하는 이유는 무엇일까? (2) | 2020.01.24 |
---|---|
백준 4373번 문제 수집합 풀이 (0) | 2020.01.13 |
코딩테스트 언어 선택 팁 (0) | 2019.12.12 |
Codeforces Round #601 (Div 2) 참가 후기 (0) | 2019.11.22 |
백준 16563번 어려운 소인수 분해 문제와 내 오개념 (0) | 2019.11.14 |