https://plzrun.tistory.com/entry/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4PS-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0
개인적으로 직접 이분 블로그를 들어가서 읽어보는게 좋다고 생각합니다.
다른 번외편이나 시작하게 된 계기들도 쓰여져 있어 자극이 될거 같습니다.
제가 이 글을 본건 이직준비 해야겠다고 마음을 먹은, 18년 초 쯤이였던거 같아요.
이 글을 보고, 상당히 충격받았죠.. 난 진짜 개발자가 아니구나
알고리즘 공부를 해야겠다. 고 생각한지 벌써 1년
일하면서 알고리즘 공부 하는게 쉽지 않았지만, 그래도 기초 개념정도는 많이 익혔고
아래 문제 풀어보라는데로 계속 풀어보고 있습니다. 핑계아닌 핑계가 많았지만,
이번년도부터 좀 더 부지런하고 많이 풀어볼 예정입니다.
이런건 고수들이나 써야 하지 않나 싶지만,
그래도 1년정도 공부하면서 이 분야를 어떻게 시작해야 할지 써보려 한다.
라고 운을 뗀다음 열심히 내 얘기만 했던 후속편이다.
내 인생사가 궁금하신 분들은 이 글의 전편을 읽어볼만 하다. ㅋㅋ 스크롤은 상당히 긴 편이다. 주의할 것
http://plzrun.tistory.com/entry/PS공부를-하면서-좌절감을-느낀-분들이-읽어봤으면-하는-나의-2016년
아무튼 그럼 어떻게 공부해야할까?
나는 아직도 PS(Problem Solving)를 잘 못하지만,
주변에 처음 시작하는 사람들이 내게 PS 공부 방법에 대한 고민을 자주 털어놔서 글로 정리해보려고 한다.
ps를 처음 시작하면 online judge에 들어가서 몇 문제를 풀어봤을 것이다.
근데, 문제를 풀어봐도 내 실력이 느는 느낌도 안나고,
문제 하나 푸는데 시간도 엄청 걸리고,
풀 수 있는 문제도 거의 없다.
이때 주변에 잘하는 사람이 있어서 도움을 받으면 최고로 좋은 케이스지만,
보통 나 같은 사람들은 도움 받을 사람도 없고
인터넷을 뒤적뒤적하고 책을 찾게 된다.
근데 또 책은 왜이렇게 진도가 안나가?
코드를 읽으면 자꾸 모르는 STL이 등장하고,
이거 찾아보고 익히는데 또 한참 걸리고,
나중에 돌아와서는 다시 코드 로직을 뜯어봐야하고 (이 시절엔 코드 딱보고 그게 뭔지 한눈에 안보이지...)
다시 내가 문제를 직접 풀어보는데 헤매고.. 그러다보면 하루종일 붙들고 있어도 3~4페이지도 못나간다.
그렇다고 문제부터 풀면서 시작하자니 어떤걸 풀어야 할지도 모르겠고,
이것저것 건드려는 보는데, 역시나 풀어봐야 실력이 전혀 오르는거 같지 않다.
어디서부터 문제일까?
어디부터 공부해야할까?
어떤 문제를 풀어야 할까?
도움은 어디서 받아야 할까?
문제를 이렇게 오래잡고 있어도 될까?
모르는 STL은 한방에 묶어서 누가 해결 좀 해줬으면 좋겠다...
이런 생각을 가진 분들이라면 이 글을 읽어볼만 할거다.
내가 항상 하는 말이 있는데,
모르는 사람은 본인 스스로가 무엇을 모르는지 모른다.
자기 스스로가 모르고 있다는 사실 조차 모르는 것이다.
그렇기 때문에 뭘 물어봐야 하는지도 모른다.
그래서 나는 내가 가진 문제점을 안다는 것 자체만으로 그 문제의 90%는 해결되었다고 본다.
그럼 문제들을 알아보고 해결책을 찾아보자.
먼저 알고리즘의 숲을 봐야한다.
적어도 나는 그렇게 생각한다.
알고리즘 전체에 대한 목록이 어떤게 있는지 크게 살펴봐야 한다.
그걸 좋은 대학에 다니는 사람들은 주변 친구나 갓(God)들을 통해 해결이 가능한데,
나는 그런 케이스가 아니라서 백준 강의를 통해 해결했다.
내가 백준 강의 홍보대사를 맡은것도 아니고 그 분한테 광고비를 받는것도 아니다.
하지만, 내가 위에서 언급한 상태라면 강력 추천한다.
오프라인 강의가 비싸다면 온라인강의라도 듣는 것을 추천한다.
현재는 강의마다 9만9천원에 올라와 있는데,
내가 듣는 것을 추천하는 온라인 강의는 기초,중급1,중급2 부분이다.
이게 오프라인 강의에서는 입출력부터 시작해서 네트워크 플로우 나오는 부분까지를 말한다. (아마 2달치로 구성되어 있을 것이다.)
이름은 계속 바뀔테지만, 여기까지가 기초다.
다시 말하지만, 기초다.
여기까지 하고나면 알고리즘이라는 거대한 숲을보는 안목이 생기고
STL을 몰라서 헤매는 부분이 자연스럽게 해결된다.
안보이던 종만북도 쉽게 읽히고,
스스로 공부하는 데 무리가 없게 된다.
만약 강의에 거부감이 있다면,
다음과 같은 방법을 따르는 것을 추천한다.
2018.11.23 수정 - (원래 빨간책이란걸 추천했으나, 지금은 추천하지 않는다.)
추천하지 않는 이유 (Click)
BOJ에서 다음 문제들을 쭉 순서대로 풀어본다. boj.kr/문제번호 <= 형태로 검색하면 된다.
입출력 - 2557, 1000, 2558, 10950, 10951, 10952, 10953, 11021, 11022, 11718, 11719, 11720, 11721, 2741, 2742, 2739, 1924, 8393, 10818, 2438, 2439, 2440, 2441, 2442, 2445, 2522, 2446, 10991, 10992
입출력 문제들을 풀 때 10분이상 이 문제를 붙들고 있는 경우, 그건 입출력에서 뭔가 모르는 부분이 반드시 있다는 뜻이므로 이전 질문들을 무조건 찾아보고 다른 사람이 푼 코드를 반드시 봐야 한다.(이건 should가 아니라 must다.) 이 때 코드 길이 줄이려고 이상하게 짧은 코드들 많은데, 그런건 보지 말고 랭킹 100위권 안에 드는 사람들 중 인덴트 멀쩡한 코드를 보면 될거다.
그 다음 DP문제를 풀어보자.
DP - 1463, 11726, 11727, 9095, 10844, 11057, 2193, 9465, 2156, 11053, 11055, 11722, 11054, 1912, 2579, 1699, 2133, 9461, 2225, 2011, 11052
백준님은 모르는 문제가 있으면 2시간을 넘기지 말라고 했는데, 나는 이런 기초 문제는 1시간을 넘길 필요가 없다고 생각한다. 흔히들 PS를 처음 접하는 사람들이 하는 큰 실수가 모르는 문제를 하루종일 붙들고 있는 건데, 우린 수학이란 과목을 정규과정만으로는 초등학교 6년, 중학교 3년, 고등학교 3년 동안 배웠다. 그런데 알고리즘에는 그만한 시간을 투자할 수 없다. 그러나 알고리즘의 양은 그만큼 방대하다. 그러니 수학문제 풀듯이 계속 붙들고 있는건 미련한 짓이다. 이건 마치 덧셈,곱셈 정도만 아는 상태에서 미적문제를 푸려는 시도와 같다고 생각한다. 앞서 말했다시피 모르는 사람은 뭘 모르는지 모르는게 문제다. 본인이 미적에 대한 개념이 있는지 조차 모르는데 그 문제를 백날 붙들고 있어봐야 풀릴까? 당연히 아니다... 일단 1시간 넘어가면 그 문제 풀 확률은 거의 없다고 봐도 된다. 그러니 바로바로 찾아봐라. 특히 이 문제들은 정말 기초 문제들이고 사람들이 많이 풀었기 때문에 네이버나 구글에 검색하면 자세한 설명과 코드가 넘쳐난다.
반드시 지키자! 1시간 넘어가면 풀던 짓을 그만두고 반드시 AC받은 코드 찾아보기 (설명이 꼭 달려있는 코드를 읽자)
한 문제 가지고 며칠씩 씨름하고 풀어봐야 다음에 풀지도 못할뿐더러 아주 비효율적인 방법으로 푸는 경우도 있을 거다.
그러는 것 보다 이 문제의 답을 빨리 확인하고 이와 유사한 문제들을 여러개 풀어제끼는 것이 아주아주 현명한 방법임을 명심하자.
그리고 푼 다음에는 반드시 다른 사람의 코드를 봐야 한다.
특히 자신만의 가상의 스승을 잡고 그 분의 코드를 보는 것도 좋은 방법이라 생각한다.
너무 갓갓들은 이상한 방식으로도 짜는 경우도 있기 때문에 적당한 사람을 선택해야 한다.
그 사람의 코드를 보면 잘 이해가 되고, BOJ랭킹은 100위 안에 드는 사람이면 적당하다.
근데 처음부터 끝까지 하나하나 세밀하게 볼 필요는 없다.
로직 대충 비슷해보이면 스킵하고, 나랑 완전 다른 방법인데 참신하면 들여다보고 하는거지 뭐...
그 다음 이런 저런 문제들을 풀어보자.
2751, 11650, 11651, 10814, 10825, 10989, 11652, 11004, 10828, 9012, 10799, 10845, 10866, 10808, 10809, 10820, 2743, 11655, 10824, 11656, 1406, 1158, 1168, 10430, 2609, 1934, 1850, 9613, 11005, 2745, 1373, 1212, 2089, 11576, 1978, 1929, 6588, 11653, 10872, 1676, 2004
여기까지 다 풀고 나면 이제 재밌는 그래프 문제(bfs, dfs)를 풀어보자.
그래프 - 1260, 11724, 1707, 10451, 2331, 9466, 2667, 4963, 7576, 2178, 2146, 1991, 11725, 1167, 1967
코포(Codeforces) div2에서도 자주 등장하는 binary search 문제도 풀어보자. (여기엔 ternary search도 있다.)
이분탐색/삼분탐색 - 1654, 2805, 2110, 10815, 10816, 11662
분할정복도 풀어보자~
분할정복은 DP랑 거의 똑같은데, 부분문제를 dp테이블에 저장할 필요가 없는(cache질을 할 필요가 없음) 부분이 DP랑 다른 점이다.
분할정복 - 11728, 1780, 11729, 1992, 2447, 2448, 1517, 2261
그리디 알고리즘은 매 순간 최선을 선택한다라는 말 때문에 매우 쉽게 들리지만, 매 순간의 선택이 최선이 되도록 방법을 정하는 것 자체가 매우 어렵기 때문에 알고리즘중에 사람들이 가장 어려워 한다. 특히 그리디 문제가 어떤 알고리즘으로 풀리는지 감이 전혀 안온 상태라면.. ㄷㄷㄷ
그리디 - 11047, 2875, 10610, 1783, 1931, 11399, 2873, 1744
근데 사실 나는 그리디보다 완전탐색(exhaustive search)이 더 어렵다.
나는 이걸 쌩짜구현이라고 표현하는데 ㅠㅠ... 어후.. 정말 이 파트는 "말하는 대로" 구현해야 하는 문제라.. ㅠㅠ 이걸 잘해야 정말 쉬운 문제들을 척척 풀어나갈 수 있다.
완전탐색 - 1476, 1107, 1451, 9095, 10819, 10971, 1697, 1963, 9019, 1525, 2251, 2186, 3108, 5014, 1759, 2580, 1987, 6603, 1182, 2003, 1806, 1644, 1261, 1208, 7453, 2632, 2143
여기까지 푸는게 딱 4주 분량이다. (BOJ 문제 부분만)
여기까지 푸는데 4주를 안넘기는게 좋다고 생각한다. 왜냐면, PS를 하면서 느낀건데, 단기간에 몰아서 왕창 할 수록 얻는 양은 어마어마하게 달라지는 것 같다.
보통 그리디 문제 전까지 2주를 잡고 그리디랑 완탐부분을 2주 잡으면 될거다. (그리디랑 완탐 양이 어마어마 함. 저 문제 다 풀기 정말 힘듦 ㅠ)
이 정도 했으면 이제 종만북(알고리즘 문제 해결전략)을 보자.
(http://book.naver.com/bookdb/book_detail.nhn?bid=7058764)
나는 이 단계에 오기 전에 종만북 보는 거를 매우 비추한다. 물론 처음 부터 종만북보고 정말 잘하시는 분들도 계시지만, 종만북 이거 절대 초보자용 아님. ㅋㅋ 아니 초보자용이긴 한데, 이 정도 한 사람을 이제 인간계에 막 들어온 쌩초보 정도로 보는게 맞는 것 같다.ㅋㅋ
갠적으로 종만북은 1권 뒷 부분부터 읽는걸 추천한다.
종만북 보면 어디어디 선택해서 보라고 나와있는데, 나는 그것보다 1권 마지막 수치해석부터 읽는 것을 추천한다.
그리고 기하는 skip~!! 기하는 종만북 다 씹어먹을때쯤 읽는 것을 추천ㅎ
어차피 문제도 잘 안나오고 나와봐야 갓오브갓들 전용문제라 스킵스킵~
그리고 2권에 나오는 그래프 부분이 정말 재밌다.
일단 이렇게 진도가 쭉쭉 나가야 뭘 하는 재미라도 있음 ㅋㅋㅋ
그리고 2권 다 봤으면 1권 보면 된다.
(종만북 보면서 당연히 알고스팟 문제들 다 풀어봐야 한다.)
그 다음 노란책을 보자. (http://book.naver.com/bookdb/book_detail.nhn?bid=6750543)
이거 평점이 상당히 안좋은데, 번역이 안좋아서 그렇다.
그런데도 이 책을 추천하는 이유는, 여기까지 공부한 상태라면 오타랑 어색한 표현들이 그냥 다 보이기 때문이다.
노란책의 장점은 네트워크 플로우 부분이라 생각한다.
또 전체적으로 책이 매우 얇으면서도 있을건 다있고 정말 보면 볼 수록 갓책이라는 느낌이 들거다.
특히 종만북 네트워크 플로우 부분이 너무 없고 (Dinic도 없고 MCMF도 없고 설명도 영...)
문자열 파트도 좀 이해하기 힘들게 설명된 부분이 많은데, (물론 아는 사람이 보면 다 잘 이해가 되지만...)
그런 부분들을 노란책이 다 메꿔주는 것 같다.
어차피 노란책을 볼 때 쯤이면, 취업 걱정 할 일이 없을거고
시작하기 전의 나 자신을 돌아보면 참 많이 발전했다는 것을 느낄 수 있을 거다.
나는 아직 노란책을 반 정도 밖에 안본 상태고 종만북 기하랑 DP최적화 부분을 보지 않은 상태다.
또한 PS 분야를 잘 하지도 못하고 제대로 알지 못하는 상황에서 잘못된 정보를 전달했을까봐 걱정이 되긴 하지만,
그래도 처음 PS를 접하는 분들에게 길잡는 역할 정도는 할 수 있다 생각해서 적어봤다. 또한 그러기를 빈다.
그럼 다들 즐거운 PS 하시길~!
내가 자주 이용하는 사이트는 굵은색과 글씨크기로 중요도를 표시했다.
C++ Reference: http://cppreference.com (www.cplusplus.com 거기보다 십만배 좋다고 생각하는 C++ reference 사이트다. 디자인도 좋고 훨씬 깔끔하고 훨씬 보기가 좋다.)
백준 온라인 강의: https://code.plus
백준 온라인 저지: https://boj.kr
알고스팟 종만북 문제집: https://algospot.com/judge/problem/list/?tag=&source=알고리즘+문제+해결+전략&author=
정올 온라인 저지: http://www.jungol.co.kr
(정올 문제를 BOJ에서 풀다가 WA를 받은 경우 정올 가서 서밋해보면 틀린 테케를 확인할 수 있다. 다만, 문제 이름은 서로 다를 수 있으므로 출처를 통해 알아서 잘 찾아야 한다. ㅋ 테케는 BOJ가 다른 OJ보다 훨씬 센 편이다. 다른 곳에서 돌아가는 코드가 BOJ에서 안돌아가는 경우를 심심찮게 확인할 수 있는데, 보통 공식 테케가 허접한 경우일 때가 많다.)
더블릿: 단계별 학습으로 유명한데, 유료다. 알고스팟과 BOJ가 있는 마당에 돈을 내면서까지 이용해야 하는지는 잘 모르겠다.
koi4study: http://koistudy.net (유용한 자료가 많다. 특히 여기서 소개하는 hustoj가 있는데, 초딩도 쉽게 만들 수 있을만큼 설명이 되어있다. 나만의 OJ를 원한다면 첫 OJ로 경험하기엔 아주 딱인것 같다. 그리고 여기서 소개되는 두 선생님의 사이트가 있는데, 가보면 어린 친구들이 많은걸 볼 수 있다. 직접 이용을 하진 않아서 그 저지가 어떤지는 잘 모르겠다.)
BOJ Slack: https://www.acmicpc.net/board/view/2788 (여기서 슬렉 초대메일을 받을 수 있다. 초대 메일이 안보인다면 Junk Mail에 들어가 있을 수도 있으므로 잘 찾아볼 것. 갓들의 피드백을 바로바로 받을 수 있다. 여기가 아니었다면 내가 PS를 1년가까이 지속해서 할 수 있었을까?? 나를 지탱해준 힘은 여기인듯 하다.)
외국 온라인 저지
코드포스: http://codeforces.com (국내에서 가장 많이 이용하는 외국 사이트가 아닐까?)
탑코더: https://community.topcoder.com/contest/arena/ContestAppletProd.jnlp (링크 누르면 다운로드가 된다.)
탑코더 공식 홈페이지에 들어가보면 뭔가 그럴싸하게 보이지만, 만들다 만거라고 보면 된다. ps분야 말고도 이거저거 하는게 많은데, 다른 분야는 모르겠고 ps arena에 들어가보면 beta버전이라고 되어있는데 내가 알기로 여기선 뭔가 contest를 진행할 수가 없다. 다들 위의 경로에서 다운받은 옛날 스타크래프 배틀넷 같이 생긴 어플을 통해 콘테스트를 치룬다. 와 정말 점점 느끼는 거지만 BOJ만큼 현대적인 인터페이스를 제공하는 온라인 저지가 없다. 코포도 보면 가관일때가 있다.(하다보면 앎) 아무튼 탑코더는 해보면 아는데, 희한하게 문제에서 제시한 조건에 맞는 클래스를 생성해서 제출해야 하며 스타 배장같이 생긴 arena에서 코딩 맞짱을 뜨는 느낌이 든다.
uvaoj: https://uva.onlinejudge.org (acm-icpc 출제자들이 여기서 문제를 냈다는거 같은데, 엄청 오래됐고 엄청 유명한 사이트다. 웹 UI는 극악이다. 해보면 안다. 여기가 워스트라고 생각 됨) ☞ 그래서 반드시 https://uhunt.onlinejudge.org 사이트가 병행된다. uvaoj를 쓸 수 있게끔 해주는 필수 사이트!
poj: http://poj.org (북경대 온라인저지: 노란책때문에 처음 알게 됐는데, 이 저지도 상당히 유명하다.)
spoj: http://www.spoj.com (이런 저지도 있다.)
a2oj: https://a2oj.com (여기 가면 해외 유명 온라인 저지랑 전부 연동이 가능하다. 여기서 보여주는 저지들이 아마 해외에서 제일 유명한 저지들이 아닐까 싶다.)
요즘 내가 들어가는 사이트 순서대로 글자 크기와 Bold체를 써서 나태내봤다.
눈에 띄는 정도가 중요도 순서라고 봐도 무방하다.
===========================================================================================================================
- 2018.10.06
회사 시험대비 질문하시면 답변 안하겠습니다.
지름길은 없습니다.
수능/논술 파이널 강의라고 해서 1주일에 100~200만원씩 하는 것도
지금까지 공부해온 친구들에게나 의미가 있습니다.
제가 위에 적은것들 반만했어도
국내 회사 어디가서 발로 풀어도 합격합니다.
잘할 필요도 없습니다.
한 6개월만해도 누구나 할 수 있거든요?
위에 돈없어도 할 수 있는 모든 방법을 적어놨습니다.
다른 방법 그만 물어봐주세요.
다른 방법 없습니다.
시험까지 한달도 안남았는데,
이거 보고 취업준비로 알고리즘 시작하는건 이미 늦은거에요.
망한거라구요.
반년 더 준비하시면 됩니다.
'개발자 경력관리 > :) 공부 자극 받는' 카테고리의 다른 글
[코딩/프로그래머 추천사이트] NAVER D2 개발자 커뮤니티 SLipp 스터디 (0) | 2019.02.08 |
---|