[실전 알고리즘] 0x00강 - 오리엔테이션

 

안녕하세요, 바킹독입니다. 리뉴얼을 완료해서 다시 강의를 올립니다.

 

혹시 코딩테스트를 대비하고자 하는 목적으로 검색하다가 이 강좌를 보게 된거라면 지금 이 강좌가 정말 큰 도움이 된다고 확신할 수 있습니다.

 

무난한 목차입니다. 이거 PPT 디자인도 원래 있던 템플릿에서 핑크톤으로 제가 바꾼건데  좀 잘 만들지 않았나요?

 

아무튼 자기소개를 좀 해볼겠습니다. 말이 자기소개지 사실상 자기자랑이니 조금 쑥스럽기는 하지만 또 21세기 하면 자기 PR의 시대가 아니겠습니까. 그래서 당당하게 자랑 좀 하고 가겠습니다.

 

일단 저는 고려대학교 재학중이고 곧 백수가 될 예정입니다. 졸업을 하기 때문입니다. 

 

그리고 대학생때 저는 알고리즘을 아주 열심히 했습니다. 어렸을 때 정보올림피아드를 하긴 했지만 깊게 발을 담그지는 않았고 대학에 와서는 원래 해킹에 관심이 더 많았는데 시스템 해킹에서 한계를 느꼈을 때 노느니 코딩이라도 하자는 마음으로 다시 시작했습니다. 이렇게까지 할 줄은 몰랐는데  여러 대회를 참여하고 과 동기이랑 으쌰으쌰하면서 공부하다보니 지금까지 왔습니다.

 

역시 실력을 나타내는 객관적인 지표로 수상실적만한게 없는 것 같아서 제 수상 기록들을 소개하겠습니다. 이쪽 대회 중에서 가장 큰 형님인 ICPC의 경우 2018년 서울 리저널에서 대학 기준 6th Place 및 등수 10등, 2018년 하노이 리저널에서 대학 기준 5th Place 및 등수 5등, 2019년 서울 리저널에서 대학 기준 12th Place 및 등수 20등, 2019년 다낭 리저널에서 대학 기준 6th Place 및 등수 6등을 기록했습니다.

 

그리고 삼성에서 주최하는 프로그래밍 대회인 SCPC에서 2017, 2018년 모두 5등상을 받았고 카카오 코드페스티벌에서도 2018년에 5등상을 받았습니다.

 

또 온라인으로 『진짜』들끼리 알고리즘 역량을 겨룰 수 있는 Codeforces 사이트에서 저는 탑 레이팅 2299를 찍은 후에 마치 우리나라 코스피마냥 오렌지 박스권에 머무르고 있습니다.

 

Codeforces를 처음 들어보셨다면 오렌지가 어느 정도인지 감이 잘 안오실텐데 대략 상위 1-2% 정도에 속하는 레이팅으로, 어디 가서 "나 알고리즘 공부 좀 했다"라고는 충분히 말할 수 있는 정도의 레이팅입니다. 롤로 따지면 다이아3 정도입니다.

 

그 외에도 알고리즘 강의와 크게 상관은 없지만 육목을 두는 AI끼리 경쟁하는 삼성전자 DS부문 육목 알고리즘 대회에서 1인팀으로 2017, 2018년 모두 우승했고 해킹 및 암호학 분야에서도 2017 암호경진대회 우수상, 삼성전자에서 주최한 SCTF 2017년 암호학 부문 특별상, 코드게이트 2019 대학생부 2등, 그리고 DEF CON을 포함한 다양한 국내외 CTF 참여 경험을 가지고 있습니다.

 

단순히 자기 자랑을 하려고 수상 실적을 나열한 것은 아니고, 당연히 국내에서 알고리즘을 저보다 잘하는 사람은 수두룩 빽빽하지만 알고리즘 분야에서의 실적을 봤을 때 그래도 여러분이 온/오프라인에서 접할 수 있는 대부분의 알고리즘 관련 강사들보다는 제 실력이 나을거니까 절 딱 믿고 따라오면 된다, 뭐 그런 얘기를 하고 싶었습니다. 좀 믿음이 가나요?

 

또 저는 강의 경력도 적당히 있습니다. 삼성리서치랑 삼성전자 인재개발원에서 Advanced 등급(=A형) 보유자들을 대상으로 Professional 등급(=B형)을 획득할 수 있게 하는 튜터링과 강의를 한 적도 있고, 특정 기관의 코딩테스트 문제를 출제한 경험도 있습니다. 다만 NDA(비밀유지서약서)를 작성하기도 했고, 굳이 법적 문제가 아니더라도 상식적으로 제가 출제한 문제를 써먹는건 올바르지 않기 때문에 어떤 기관이었는지, 어떤 내용을 출제했는지 등은 절대 드러내지 않을것입니다.

 

작년에는 서울에서 취준생을 대상으로 A형을 취득할 수 있게 도와주는 무료 특강을 진행하기도 했으니까 괜히 자기 잘났다고 강의를 어려운 내용으로 도배해놓고 혼자 신나가지고 뇌절하는건 아닌가 하는 걱정은 안하셔도 됩니다. 코딩테스트를 준비하시는 분들이 어떤 내용에서 어려워하는지를 잘 알고 있기 때문에 기초부터 시작해서 정말 꼼꼼하고 자세하게 설명을 할 것입니다.

 

이제 강의를 소개해보려고 합니다. 제 강의는 C/C++ 언어를 알고 있지만 자료구조/알고리즘은 약한 취준생, 학부생, 비전공자를 대상으로 하는 강의입니다. 이미 자료구조와 알고리즘을 잘 아는데 복습을 위해 강의를 보는 것도 물론 환영이지만 기본적으로 시청자가 자료구조와 알고리즘에 대한 선수 지식이 없는 가정하에 커리큘럼을 구성했으니 참고 부탁드립니다. 만약 지금 프로그래밍 언어에 대한 학습이 부족한 상황이라고 한다면 직접 코딩을 해보는 일이 많은 이 강의의 내용을 따라갈 수 없기 때문에 일단 언어부터 익히고 나서 강의를 들어야 합니다.

 

만약 C언어는 알고 있는데 C++을 잘 모른다고 하면 강의를 따라오는데 큰 문제가 없습니다. 강의에서 다소 생소할 수 있는 C++문법들에 대해서는 설명을 해두었기 때문에 굳이 C++을 마스터하고 이 강의를 들으려고 하기 보다는 강의와 함께 C++ 공부도 병행하면 됩니다.

 

제일 애매한 경우가 자바나 파이썬으로 코딩테스트를 응시할 분들인데, 일단 저는 시간이 많을 경우 가능하면 C/C++로 옮겨타서 코딩테스트를 보는게 좋다고 생각합니다. 끽해야 10줄 내외의 함수를 작성하는 부류의 코딩테스트라면 크게 상관없지만 기본적으로 자바/파이썬은 동작 속도가 느려 전수조사 문제에서 손해를 보고, 인터넷 상의 자료도 C/C++에 비해 많이 부족하기 때문입니다. 그런데 응시하는 코딩테스트에서 자바나 파이썬을 지원해준다면 웬만하면 두 언어로도 정답을 받을 수 있게 해뒀을 것이니까 이미 자바나 파이썬이 너무 친숙해서 바꾸고 싶지 않다면 그렇게 하셔도 됩니다.

 

다만 이 강의는 C/C++로 된 코드만 제공을 합니다. 각 언어에 맞추어 자료를 다 따로 준비할까 생각도 해보긴 했는데 그렇게 되면 자료를 만드는게 너무 시간이 많이 들어서 힘들 것 같습니다. 일단 C/C++ 버전을 끝낸 뒤에 각 언어 버전을 따로 제작을 할지말지 생각하려고 합니다. 그래서 자바/파이썬으로 코딩테스트를 치려고 한다면 당장은 달리 방법이 없습니다. 그래도 C/C++에 특화된 구현을 제외한 나머지 내용은 언어와 크게 상관이 없으니 일단 강의를 한 번 보고, 도저히 안되겠다 싶으면 제 강의 대신 코딩테스트를 치고자 하는 언어에 특화된 강의를 찾아서 보시면 됩니다.

 

제 강의의 목표는 여러분이 삼성전자 SW Test A형과 B형 중간 수준의 코딩테스트를 통과할 수 있게끔 도와드리는 것입니다. 이 정도 난이도면 어떤 기업의 코딩테스트를 준비하더라도 다 커버가 될 것입니다. 이 강의는 첫째도 코딩테스트, 둘째도 코딩테스트, 셋째도 코딩테스트가 그 목적이니까 학부 수업과는 다르게 자료구조/알고리즘이 실제 어떤 문제들에서 쓰이는지, 그리고 어떻게 구현을 효율적으로 할 수 있는지를 깊게 다룹니다. 

 

또 해쉬의 구현과 같이 현실적으로 코딩테스트에 나올 가능성은 0에 가깝지만 차마 그냥 넘어가긴 좀 그런 개념들은 "면접에는 충분히 물어볼 수 있지만 코딩테스트를 대비할 땐 필요가 없다"와 같은 설명을 덧붙여놓기 때문에 자연스럽게 자신의 목적에 따라 내용을 취사선택할 수 있다는 장점도 있습니다.

 

(강의 목록이 일부 수정되었습니다. 자세한건 Github을 참고해주세요.) 강의는 오리엔테이션을 포함해서 총 32강 + 부록 4강으로 예정되어 있습니다. 왜 굳이 10진수로 안하고 16진수로 번호를 붙였냐고 하면 할 말은 없지만 그게 또 zl젼해커의 스웩이 아닐까 싶습니다.

 

각 단원 내용은 하루 혹은 이틀 정도 투자하면 이해할 수 있는 분량인데 초반에는 내용이 쉬우니 진도가 잘 나가고 뒤로 갈수록 어려워지는 점을 감안해서 초반에는 빨리빨리 넘어가면 좋겠습니다. 각 단원에는 연관이 있는 연습 문제들도 엄청 많이 제공되서 적어도 세 문제에서 다섯 문제 정도는 푼 후에 다음 강의로 넘어가시면 좋겠고 모든 강의를 다 듣고 나면 산더미같이 쌓인 문제들을 주구장창 풀면 됩니다. 진짜진짜진짜진짜 자기가 많이 짜봐야 느니까 꼭 많이 짜보셔야 합니다. 주말 없이 알고리즘에 몰빵해서 하루 8시간 이상 빡공을 하면 2~4개월 안에 끝낼 수 있고, 다른 활동과 병행을 해야 해서 그렇게 하기가 힘들면 넉넉하게 적당히 4~6개월 정도 잡으시면 될 것 같습니다.

 

설마 코딩테스트가 하루나 일주일 정도 남았는데 한가롭게 오리엔테이션부터 정주행하고 계신분은 없겠죠? 그런 분이 있다면 이 강의는 그만 보시고 차라리 기출 문제들 모음집이랑 풀이를 훑어보시는게 나아보입니다. 당연히 완강을 할 수 있다면 당연히 완강을 하는게 좋지만 당장 한 달 후에 코딩테스트를 친다거나, 자소서를 준비해야한다거나 하는 이유로 시간이 촉박해서 현실적으로 완강을 하는게 불가능할 경우에는 어떻게든 짬을 내서 0x11강까지만 보고 기출을 최대한 많이 푼 후에 코딩테스트에 임하시면 그래도 충분히 승산이 있습니다.

 

0x12강 이후의 내용들도 코딩테스트에 충분히 나올 수 있지만 대부분의 문제들이 0x11강 이전의 내용들 정도로 나오는 경우가 많고 특히 삼성 A형 같은 경우도 대놓고 출제 범위를 알려주는건 아니지만 일단 지금까지는 전부 BFS/DFS/백트래킹/시뮬레이션 문제였기 때문입니다.

 

전반적인 강의 진행 방향을 알았으니 이번에는 코딩테스트가 무엇인지를 다뤄보겠습니다. 코딩테스트는 주어진 문제를 정해진 시간 제한과 메모리 제한 내로 해결할 수 있는 능력을 측정하는 테스트입니다. 이전에 온라인 저지 사이트에서 문제를 풀어본 적이 없다면 대체 무슨 소린가 싶을텐데 대충 이런식입니다.

 

"10 이하의 두 자연수가 한 줄에 공백을 사이에 두고 주어진다. 두 자연수를 합한 결과를 출력하라." 이렇게 문제가 주어지고 시간 제한, 메모리 제한과 함께 예시 한 두개도 주어집니다. 시간 제한이 1초라는 얘기가 이 문제를 보자마자 1초 안에 해결하라는 소리는 아니고, 프로그램이 시작하고 결과를 1초 안에 내고 정상적으로 종료되어야 한다는 의미입니다. 그리고 메모리 제한 256MB는 이 프로그램이 메모리를 256MB 이하로 사용해야 한다는 의미입니다.

 

시간 제한과 메모리 제한은 기초 코드 작성 요령 단원에서 자세히 알려드릴테니 지금은 신경쓰지 말고 그냥 문제를 해결해봅시다. 코드를 어떻게 짜야할지 알겠나요? 어렵게 생각할 것 없이 그냥 두 수를 입력받고 합한 후에 출력하면 될 것입니다. 저는 cin, cout을 썼는데 cin / cout이 안익숙하면 printf / scanf 를 써도 상관없습니다. 아무튼 이렇게 주어진 문제를 구현한 코드를 제출하면 서버는 코드를 채점합니다.

 

코드를 채점한다는게 뭔 소린가 하면 누군가가 수동으로 코드를 확인하는게 아니라, 숨겨져 있던 수많은 입력 데이터들에 대해 프로그램의 출력이 올바른지 확인한다는 의미입니다.

 

이 때 이 입력 데이터는 문제에서 주어진 입력의 제한 조건을 만족한다는게 보장됩니다. 예를 들어 앞의 문제에서 두 수가 10 이하라는 조건이 있었는데, 주어진 입력이 진짜 그 조건을 만족하는지 따로 if문으로 확인할 필요가 없고 10 이하가 맞다고 생각하고 코드를 짜면 됩니다.

 

제가 짠 코드는 모든 입력에 대해 올바른 출력을 냈고 시간 제한과 메모리 제한도 다 준수했으니 이 문제를 맞은 것으로 처리됩니다. 참고로 이렇게 코드의 채점을 진행하는 입력 데이터를 테스트 케이스(Test Case)나 줄여서 TC라고 부릅니다.

 

이번에는 동일한 문제에서 올바르지 않은 코드를 제출했다고 해보겠습니다. 문제를 제대로 안 읽고 그냥 9만 출력하는 코드를 제출하면 어떻게 될까요?

 

3+6은 9이니 일단 예시는 정상적으로 나올 것입니다. 차라리 아예 예시부터 잘못 나오면 차라리 빨리 틀렸다는걸 깨닫고 제출 전에 고칠텐데 안타깝게 됐습니다. 아무튼 이렇게 잘못된 코드라도 제출을 하면 서버는 코드를 채점합니다.

 

맨 처음에 주어진 예제와 다음 테스트 케이스에 대해서는 올바른 출력을 내었지만 나머지 테스트 케이스들은 모두 틀리고 말았습니다. 아주 간혹 모든 테스트 케이스에 대해 올바른 답을 내지는 못하더라도 부분 점수를 주는 경우가 있긴한데, 대부분의 경우 단 한 개의 테스트케이스라도 통과하지 못한다면 그냥 그 문제를 틀린거고 아무런 점수도 획득하지 못합니다. 

 

그렇기 때문에 정말 안타깝지만 "한 개 빼고 모든 테스트 케이스를 통과했다" 와 같은 것은 사실 그냥 그 문제를 틀린 것입니다. 서술형 시험이었으면 한 200줄 짠걸로 부분점수라도 어떻게 비벼볼텐데 코딩테스트에서는 설령 내가 풀이를 완벽하게 아는 문제라고 하더라도 구현을 못하면, 혹은 구현을 잘못하면 그냥 0점인거니까 어떻게 보면 참 잔인합니다. 그래도 어쩔 수 없이 이런 일을 막으려면 꼼꼼하게 코딩하는 습관을 길러야 합니다. 

 

채점이 종료된 후에 플랫폼에 따라 단순히 틀렸다는 것만 알려주거나 몇 번째 테스트 케이스에서 틀렸는지와 같은 추가 정보를 더 주기도 합니다. 단, 착각하면 안되는게 그 어떤 코딩테스트에서도 실제 어떤 입력에 대해 오답을 내었는지는 절대 알려주지 않습니다.

 

지금 문제 상황을 예로 들면 3번째 테스트 케이스에서 틀렸다는 것은 알려주는 플랫폼도 여럿 있지만, 입력 "9 7"에서 틀렸다는 것을 알려주는 경우는 절대 없습니다. 그걸 알려주면 정상적인 코드가 아니라 그냥 틀리는 입력들만 출력을 끼워맞추는 식으로 구현을 해버릴 수 있기 때문입니다.

 

그렇기 때문에 내 코드가 틀렸을 때 어떤 반례가 존재하는지 찾는게 꽤 어렵지만 정말 필요한 능력이고, 이건 하다보면 늘 것입니다.

 

국내에서 많이 쓰이는 플랫폼들에서는 틀렸을 때 어떤 피드백을 주는지 확인해보면 일단 이쪽 업게의 가장 큰 형님인 백준 온라인 저지의 경우에는 단순히 틀렸다고만 표시할 뿐, 어떤 테스트 케이스에서 틀렸는지는 알려주지 않습니다.

 

일종의 꼼수로 퍼센테이지가 올라가다가 언제 "틀렸습니다"가 뜨는지를 보고 대충 짐작할 수 있긴 하지만 그건 패스하겠습니다.

 

두 번째로는 코딩테스트에서 많이 활용되는 프로그래머스입니다. 여기는 각 테스트 케이스에 대한 결과를 다 알려줍니다.

 

이건 여담이지만 이렇게 테스트 케이스가 7개 밖에 없으면 테스트 케이스가 많이 빈약해서 잘못된 코드임에도 불구하고 통과될 수 있습니다. 보통은 아무리 적어도 30개 정도는 두고 웬만하면 50개는 넘게 해야합니다. 다르게 생각하면 코딩테스트를 치는 입장에서는 이득일 수도 있겠습니다.

 

구름도 코딩테스트에서 많이 활용되는 플랫폼입니다. 여기도 각 테스트 케이스에 대한 결과를 다 알려줍니다.

 

마지막으로 소개해드릴 플랫폼은 SW Expert Academy인데, 여기는 삼성에서 직접 운영하는 플랫폼입니다. 다른 무엇보다 삼성 sw 역량테스트가 동일한 플랫폼에서 진행되기 때문에 삼성 sw 역량테스트를 응시하기 전에 여기를 한 번은 써볼 필요가 있습니다.

 

여기서는 번호를 알려주는 대신 몇 개를 맞았는지 알려줍니다. 그런데 꼭꼭꼭 주의해야 할게 있습니다. 이 강의를 작성한 2020년 2월 기준으로 사이트에서는 지금 보시는 것과 같이 50개의 테스트 케이스 중에서 몇 개를 맞췄는지 알려주지만, 실제 시험장에서는 제출했을 때 시간초과가 났는지 여부만 알려주고 시간초과가 나지 않았다면 그냥 제출이 되었다는 안내만 나옵니다. 설령 테스트케이스에서 틀린 것이 있다고 해도 알려주지 않고 그냥 제출이 됩니다.

 

그래서 실제 시험장에서는 제출이 되길래 그 문제를 맞은 줄 알았는데 막상 알고 봤더니 그 문제를 틀려서 불합격하는 경우를 종종 볼 수 있습니다.  이런 일을 최대한 줄이려면 주어진 예제들에 대해서 올바른 답이 나온다고 그냥 제출을 해버리는게 아니라, 자기가 직접 다양한 테스트 케이스들을 생각해서 그것들에 대해 올바른 답이 나오는지를 꼼꼼하게 확인한 후에 제출해야 합니다.

 

이 강의를 보시는 분들 대부분이 코딩테스트에 부담을 많이 느끼고 있을 것 같습니다. 코딩테스트를 잘 치려면 코딩을 잘 해야 하는데, 그냥 코딩을 잘 해야 한다고만 하면 너무 막연하니까 필요한 능력을 좀 세분화해서 생각해보겠습니다.

 

코딩테스트 에서 좋은 성적을 내기 위해서는 배경지식, 문제해결능력, 구현력을 두루 갖추고 있어야 합니다.

 

첫 번째로 배경지식은 다양한 알고리즘, 자료구조, 기타 테크닉 등과 같이 문제를 해결하기 위해 필요한 지식을 의미합니다. 배경지식은 강의를 잘 따라오시면 무난하게 잘 습득할 수 있으니 걱정할 필요 없습니다.

 

두 번째로 문제해결능력은 배경지식을 지금 당면한 문제에 맞게 잘 변형해서 적용시키는 능력을 의미합니다.

 

각 단원에서는 대표적인 몇 개의 문제만 같이 고민하고 넘어가기 때문에 전형적인 문제의 풀이는 떠올릴 수 있을테지만, 문제가 마구 변형이 되었을 때에도 이 문제에서 요구하는 알고리즘이 무엇인지를 알아내는 능력이 필요합니다.

 

이건 여러분이 해당 단원의 주제에 맞는 다양한 문제를 접해보면서 조금씩 성장할 능력입니다. 즉 문제해결능력은 강의만 본다고 해서 크게 늘지 않고 여러분 스스로의 노력이 많이 필요합니다.

 

마지막으로 구현력은 본인이 생각한 풀이를 코드로 잘 옮겨낼 수 있는 능력을 의미합니다. 실제 코딩테스트를 쳐보면 아예 손도 못대겠다 하는 상황 보다는 분명히 풀이는 알겠는데 막상 짜보니까 답이 안나온다, 혹은 짜다가 꼬여서 완전 스파게티 코드가 됐다 이런 상황이 더 많을 것입니다.

 

이런 상황을 막으려면 구현력이 충분해야하고, 물론 많이 짜보는 것도 중요하지만 입문 단계에서는 내가 맞은 문제를 다른 사람들이 어떻게 짰는지를 확인하면서 배울 점을 빠르게 흡수해 좋은 코딩습관을 가지는 것도 정말 중요합니다.

 

 

예를 들어 4칸짜리 배열에서 최댓값을 찾는 문제를 생각해보겠습니다. 한번 머릿속으로 코드를 생각해본 후 스크롤을 내려서 제 첫번째 풀이도 같이 확인해보겠습니다.

 

 

arr[0]이 나머지 3개보다 전부 큰지 확인하고, arr[1]도 확인하고, arr[2]도 확인하고 다 아니면 arr[3]을 반환한다는 로직입니다. 그럭저럭 잘 짠 것 같습니다.

 

그런데 지금 이 코드는 사실 틀렸습니다. 어떤 입력에 대해 문제가 될 수 있는지 한 번 고민해봅시다.

 

찾으셨나요? 찾으셨다면 정말 잘하셨습니다. 못 찾으셨어도 괜찮습니다. 어디가 문제냐면, 최댓값이 1개만 있지 않고 여러 개인 상황을 생각해봅시다.  예를 들어 배열이 {9, 9, 3, 1}일 때 arr[0] > arr[1]이 성립하지 않아 arr[0]이 반환될 수 없고, 비슷한 논리로 따지면 arr[1] > arr[0]이 성립하지 않으니 arr[1]도 반환될 수가 없습니다. 그래서 뜻하지 않게 08번째 줄 까지 가서 arr[3], 즉 1이 반환될 것입니다.

 

조금만 고치면 잘 돌아갈 것 같은데 어떻게 수정하면 좋을지도 고민해봅시다. 잠깐동안 고민하는 시간을 가지고 계속 진행하겠습니다.

 

02, 04, 06번째 줄에서 초과(>) 조건을 이상(>=) 조건으로 고치면 해결될 것입니다. 고치고나면 이제 이 코드는 올바르게 동작합니다.

 

물론 지금 코드도 잘 동작하니 나쁘지는 않지만, 솔직히 좀 노가다성이 짙습니다. 그래서 조금 다른 방법으로 구현한 코드를 보겠습니다.

 

이건 아마 C언어를 배울 때 예제로 한번쯤은 봤을 코드일 것 같습니다. 이 코드는 최댓값을 나타낼 mx 변수에 일단 arr[0]을 넣었다가 arr[1], arr[2], arr[3]을 순차적으로 살펴보며 mx보다 큰 값이 나오면 해당 값으로 mx를 대체하는 코드입니다.

 

확실히 앞의 코드보다는 이게 훨씬 낫습니다. 이것도 나쁘지는 않지만, 또 다른 방법으로 구현한 코드를 보겠습니다.

 

이번에는 STL을 써서 날로 먹었습니다. max_element는 가장 큰 원소가 있는 곳의 포인터를 반환하는 STL이기에 앞에 *을 달아 그 주소의 값을 반환하도록 했습니다.

 

지금은 STL을 공부하는 시간이 아니니 굳이 강의를 멈추고 저것에 대해 찾아보고 올 필요는 없고 코드 자체는 나중에 익혀도 됩니다.

 

이번 예시를 통해 하고 싶은 얘기는, 물론 주어진 문제를 맨 처음의 코드처럼 짰다고 해도 틀린건 아닙니다. 하지만 적어도 코딩테스트라면 누가 봐도 지금의 코드가 더 좋을 것입니다. 그러니까 문제를 맞았다고 해서 그걸로 끝내지 말고 다른 사람이 어떻게 구현했는지 살펴보시면 지금의 max_element 함수와 같이 유용한 함수를 건져갈 수도 있고, 아예 더 나은 풀이를 알게 될 수도 있습니다.

 

정리하면 구현력을 올리기 위해 문제를 많이 풀어야하는건 물론이고, 다른 사람이 어떻게 구현했는지를 살펴보아 좋은 코드는 흡수하며 자신에게 최적화된 코딩 스타일을 계속 구축해가는게 좋습니다.

 

이제 거의 다 끝났습니다. 다음은 환경 세팅에 대한 부분인데, 강의를 듣는 동안 코딩을 계속 할테니 C++을 컴파일 할 수 있는 환경을 만들어 두셔야 합니다.

 

윈도우 사용자는 Visual Studio 2017/2019를 가장 많이 사용할 것 같고 저는 윈도우에서 Visual Studio Code를 사용하고 있긴 한데 이외에도 CLion, Dev-C++, Code::Blocks 등등 어떤 IDE를 쓰시더라도 상관이 없습니다. 다만 Visual Studio 2017/2019는 기본적으로 msvc 컴파일러를 쓰는데 거의 모든 채점서버는 gcc 컴파일러를 사용하고, msvc에서는 못쓰는데 gcc에서는 쓸 수 있는 기능이 아주 일부 있긴 합니다.

 

가장 대표적으로, msvc에서는 배열을 선언할 때 그 크기로 변수를 이용할 수 없는데 gcc에서는 가능합니다. 이를 VLA(Variable Length Array)라고 부릅니다.

 

그래서 처음에는 가능하면 Visual Studio Code로 환경을 구축해달라고 할까 했는데 삼성전자 시험장에도 Visual Studio 2017이 설치되어 있고, 강의를 듣는 분들 중 다수가 Visual Studio 2017/2019을 쓰시는 것 같아 그냥 편하신걸 쓰시면 됩니다. 제 강의 자료 내의 코드는 전부 msvc, gcc 양쪽에서 잘 돌아가는 코드들입니다.

 

다만 나중에 제 코드를 확인해보시면 #include <bits/stdc++.h> 라는 것을 많이 볼 수 있을텐데, bits 폴더 안의 stdc++.h에는 미리 수많은 헤더들을 다 include 해두어 우리가 코드에서 쓰는 헤더들을 하나하나 include 하는 번거로움을 덜어줍니다.

 

이 헤더는 gcc에는 있지만 msvc에는 없기 때문에 Visual Studio 2017/2019에서 이 헤더를 쓰고 싶으면 따로 헤더 폴더에 넣어줘야 합니다. 자세한건 구글에 "bits/stdc++.h visual studio 2017"이라고 검색해보면 어떻게 해야 되는지 잘 나와있습니다. 귀찮으시면 안해도 되긴 하지만 이걸 안해두면 저나 다른 사람의 코드를 직접 돌려보고 싶을 때 매번 헤더를 교체하고 돌려아하니 그게 번거로울 것 같습니다. 그러니 Visual Studio 2017/2019를 쓰시면 강의가 끝나고 bits/stdc++.h에 대한 처리는 바로 하는걸 추천드립니다.

 

하지만 삼성전자 SW 역량테스트 시험장에서는 해당 헤더를 못 쓰게 제한하니 algorithm, stack, vector 등과 같은 대표적인 헤더들은 이름을 잊으면 안됩니다. 지금 당장 저 3개를 외우라는 의미는 아니고 나중에 나올 때 알려드리겠습니다.

 

그리고 연습 문제들은 백준 온라인 저지에 있는 문제들로 제공이 됩니다. 문제 목록은 여기서 확인 가능합니다.

 

이제 얼추 첫 오리엔테이션으로 알려드릴 내용은 끝났습니다. 살짝 TMI이긴 한데 이 강의를 보시는 분들 대다수가 취준생일테니 저랑 동년배거나 형 누나 뻘입니다. 앞으로 재미없는 내용 조금이나마 즐겁게 익혀가시라고 잘 만들어볼테니까 이걸 들을 때 시간 맞춰서 강의 챙겨듣는다고 생각하면서 너무 고통스러워하지 마시고 친한 친구나 동생에게 수업을 받는다는 느낌으로 접근을 하시면, 또 아직 취업은 한참 멀었는데 개인적으로 공부를 하고 싶어서 이걸 듣는 아주 대단한 학부생이 있다면 형이나 오빠에게 수업을 받는다는 느낌을 가지시면 끝까지 완주하는게 조금 덜 힘들지않을까 하는 생각이 살짝 듭니다.

 

혹시 앞으로라도 강의를 보다가 궁금한 점 있으면 블로그나 유튜브를 통해 질문해주시고 개인적인 질문은 제 이메일(admin@encrypted.gg)로 보내셔도 됩니다. 능력이 되는 한 답을 드릴것이지만, 문제를 풀다가 생긴 질문은 꼭 저를 통할 필요 없이 BOJ 슬랙이나 카카오톡 오픈채팅방과 같은 오픈 커뮤니티에 질문을 하는게 더 빨리 답을 얻는 방법일 수도 있습니다.

 

[+] 2021-03-27 추가

BOJ 문제집 link : https://github.com/encrypted-def/basic-algo-lecture/blob/master/workbook.md

 

문제집을 그룹 바깥으로 옮겨두었기 때문에 앞으로 그룹 가입은 필요 없습니다.

  Comments