본문으로 바로가기

알고리즘 문제풀이(PS) 시작하기

category PS - OJ/BOJ 2016. 12. 23. 20:17

이런건 고수들이나 써야 하지 않나 싶지만,

그래도 1년정도 공부하면서 이 분야를 어떻게 시작해야 할지 써보려 한다.

라고 운을 뗀다음 열심히 내 얘기만 했던 후속편이다.

 

내 인생사가 궁금하신 분들은 이 글의 전편을 읽어볼만 하다.

http://plzrun.tistory.com/entry/PS공부를-하면서-좌절감을-느낀-분들이-읽어봤으면-하는-나의-2016년

 

아무튼 그럼 어떻게 공부해야할까?

 

나는 아직도 PS(Problem Solving)를 잘 못하지만,

주변에 처음 시작하는 사람들이 내게 PS 공부 방법에 대한 고민을 자주 털어놔서 글로 정리해보려고 한다.

 

ps를 처음 시작하면 online judge에 들어가서 몇 문제를 풀어봤을 것이다.

근데, 문제를 풀어봐도 내 실력이 느는 느낌도 안나고,

문제 하나 푸는데 시간도 엄청 걸리고,

풀 수 있는 문제도 거의 없다.

 

이때 주변에 잘하는 사람이 있어서 도움을 받으면 최고로 좋은 케이스지만,

보통 나 같은 사람들은 도움 받을 사람도 없고

인터넷을 뒤적뒤적하고 책을 찾게 된다.

 

근데 또 책은 왜이렇게 진도가 안나가?

코드를 읽으면 자꾸 모르는 STL이 등장하고,

이거 찾아보고 익히는데 또 한참 걸리고,

나중에 돌아와서는 다시 코드 로직을 뜯어봐야하고

다시 내가 문제를 직접 풀어보는데 헤매고.. 그러다보면 하루종일 붙들고 있어도 3~4페이지도 못나간다.

 

그렇다고 문제부터 풀면서 시작하자니 어떤걸 풀어야 할지도 모르겠고,

이것저것 건드려는 보는데, 역시나 풀어봐야 실력이 전혀 오르는거 같지 않다.

 

어디서부터 문제일까?

어디부터 공부해야할까?

어떤 문제를 풀어야 할까?

도움은 어디서 받아야 할까?

문제를 이렇게 오래잡고 있어도 될까?

모르는 STL은 한방에 묶어서 누가 해결 좀 해줬으면 좋겠다...

 

이런 생각을 가진 분들이라면 이 글을 읽어볼만 하다.

 

 

내가 항상 하는 말이 있는데,

모르는 사람은 본인 스스로가 무엇을 모르는지 모른다.

자기 스스로가 모르고 있다는 사실 조차 모르는 것이다.

그렇기 때문에 뭘 물어봐야 하는지도 모른다.

그래서 모르는 부분이 무엇인지부터 알아야한다.

 

모르는 부분은 어떻게 알 수 있을까?

사실 제일 쉬운방법은 주변에 잘하는 사람에게 도움을 청하는 것이겠지만,

이 글을 읽고 있는 사람은 아마도 주변에 잘하는 사람이 없는 상태일 것이므로

다음과 같은 문제를 풀어보면서 내가 아는 부분은 넘기고 모르는 부분을 빠르게 채워나가는 것이 좋다.

처음부터 책과 씨름하지 말자. 알고리즘 시작도 못해보고 퍼지기 딱 좋다.

 

 

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)

 

2018.11.23 수정 - (원래 빨간책이란걸 추천했으나, 지금은 추천하지 않는다.)

 

나는 이 단계에 오기 전에 종만북 보는 것을 매우 비추한다.

물론 처음 부터 종만북보고 정말 잘하는 분들도 있지만, 종만북은 절대 초보자용이 아니다.

 

종만북 보면 어디어디 선택해서 보라고 나와있는데

나는 그것보다 1권 마지막 수치해석부터 읽는 것이 좋다고 생각한다. (어디까지나 개인적인 생각입니다.)

그리고 기하는 skip~!! 기하는 종만북 다 씹어먹을때 쯤 읽는 것을 추천한다.

 

그리고 2권에 나오는 그래프 부분이 정말 재밌다.

 

일단 이렇게 진도가 쭉쭉 나가야 뭘 하는 재미라도 있다.

그리고 2권 다 봤으면 1권 보면 된다.

(종만북 보면서 당연히 알고스팟 문제들 다 풀어봐야 한다.)

 

 

그 다음 노란책을 보자. (http://book.naver.com/bookdb/book_detail.nhn?bid=6750543)

이거 평점이 상당히 안좋은데, 번역이 안좋아서 그렇다.

그런데도 이 책을 추천하는 이유는, 여기까지 공부한 상태라면 오타랑 어색한 표현들이 그냥 다 보이기 때문이다.

 

노란책의 장점은 네트워크 플로우 부분이라 생각한다.

또 전체적으로 책이 매우 얇으면서도 있을건 다있고 정말 보면 볼 수록 갓책이라는 느낌이 든다.

특히 종만북은 네트워크 플로우 부분이 너무 없고 (Dinic, MCMF도 없고..)

문자열 파트도 처음 보고 이해하기가 좀 어려웠는데

그런 부분들을 노란책이 다 메꿔주는 것 같다.

 

어차피 노란책을 볼 때 쯤이면, 취업 걱정 할 일이 없을거고

시작하기 전의 나 자신을 돌아보면 참 많이 발전했다는 것을 느낄 수 있을 것이다.

 

그럼 이제 다시 아까의 질문들을 떠올려보자.

 

어디서부터 문제일까?

어디부터 공부해야할까?

어떤 문제를 풀어야 할까?

도움은 어디서 받아야 할까?

문제를 이렇게 오래잡고 있어도 될까?

 

요약한 답변은 아래와 같다.

 

어디서부터 문제일까? 내가 모르는게 뭔지 몰라서 문제다.

모르는게 뭔지 어떻게 아냐? 문제풀면서 모르는걸 채워나간다. 책을 처음부터 보는 정공법이 아니라 기본문제를 풀면서 모르는 부분을 빠르게 채워 나가는 속성법이다. 다만, 반드시! 명심해야 할 것은 기초 입출력문제에서 10분이 넘어가면 반드시 모르는 부분이 있다는 것이다. 꼭! 잘하는 사람의 코드를 찾아보고, 속성법인 만큼 빠르게 모르는 것들을 캐치하고 정공법으로 돌아가야 한다.

어디부터 공부해야할까? 언급한 BOJ문제를 풀고 종만북을 본다. 종만북 다 보고 나면 노란책으로 입가심을 하자.

도움은 어디서 받아야 할까? 밑에 링크를 적었다. (BOJ Slack)

문제를 이렇게 오래잡고 있어도 될까? 입출력 문제를 제외하고 다른 문제들은 1시간으로 생각하자. 시간이 지나면 답을 보고 푼다.

  

물론 이러한 내용들은 사실 혼자 끙끙거리는 것 보다 강의를 듣는게 백배 낫다고 생각한다.

나도 백준 강의를 통해 해결했기 때문이다.

강의를 듣게 되면 위와 같은 방식으로 문제풀이를 진행하는데,

내가 백날 입출력은 10분 넘기면 모르는거라고 떠들어대도

막상 공부시작하는 사람들은

"에?! 뭐야 이거 입력하고 출력하는걸 뭐하러 해?"

"달력 출력은 시간낭비지 이걸 해서 얻는게 뭐지?"

라는 생각을 하고 그냥 넘기거나 대충하는 사람들이 있다.

 

입력받고 그냥 그대로 출력하는 문제는 30초,

날짜를 입력받고 요일을 출력하는 문제나 모두 3분 안에 코딩이 가능하다.

빠른 시간안에 코드를 짜지 못한다는건 결국 코드가 형편없다는 것을 의미한다.

빠른 시간안에 짤 수없는 방향으로 생각을 했기 때문에 코드가 빠르게 완성되지 못하는 것이다.

이걸 누군가 알려주지 않는다면 계속 우물안 개구리에 머물러 있을 확률이 높다.

이런 부분은 강의/선생님을 통해서 해결하는게 베스트이긴 하다.

 

당연히 내가 백준 강의 홍보대사를 맡은것도 아니고 그 분한테 광고비를 받는것도 아니다.

오프라인 강의가 비싸다면 온라인강의라도 듣는 것을 추천하지만,

온라인은 들어본적이 없으므로 판단은 본인 몫이다.

 

현재(2016년)는 강의마다 9만9천원에 올라와 있는데,

내가 듣는 것을 추천하는 온라인 강의는 기초,중급1,중급2 부분이다.

이게 오프라인 강의에서는 입출력부터 시작해서 네트워크 플로우 나오는 부분까지를 말한다. (아마 2달치로 구성되어 있을 것이다.)

 

여기까지가 기초다.

 

여기까지 하고나면 알고리즘이라는 거대한 숲을 보는 안목이 생기고

STL을 몰라서 헤매는 부분이 자연스럽게 해결된다.

안보이던 종만북도 쉽게 읽히고,

스스로 공부하는 데 무리가 없게 된다.

 

만약 강의에 거부감이 있다면,

처음에 언급했던 방법을 따르는 것을 추천한다.

 

그럼 다들 즐거운 PS 하시길~!

 

 

 

 

 

 

 


 

내가 자주 이용하는 사이트는 굵은색과 글씨크기로 중요도를 표시했다.

C++ Referencehttp://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에서 코딩 맞짱을 뜨는 느낌이 든다.

uvaojhttps://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체를 써서 나태내봤다.

눈에 띄는 정도가 중요도 순서라고 봐도 무방하다.

'PS - OJ > BOJ' 카테고리의 다른 글

BOJ 14265 영선 수열  (0) 2017.01.14
1280 나무심기  (0) 2016.12.26
알고리즘 문제풀이(PS) 시작하기  (333) 2016.12.23
1328 고층빌딩  (0) 2016.12.09
13333 Q-인덱스 (Q-Index)  (0) 2016.12.09
8217 유성 (Meteors)  (0) 2016.11.19

댓글을 달아 주세요

  1. 이전 댓글 더보기
  2. 2021.02.19 23:03

    비밀댓글입니다

    • BlogIcon plzrun 2021.02.23 11:40 신고

      멋지네요! 이제 페이스 유지만 잘 하시면 될 것 같아요 ^^ 사실 2주안에 끝내기는 많이 힘들긴 하죠. 다 하고 나시면 쌓은 지식에 비해 풀 수 있는 문제는 여전히 많지 않다고 느끼실텐데 꾸준히 하는 것 말고는 별 다른 방도는 없는 것 같습니다. ㅎㅓ허..ㅎㅎ 응원할게요~!

  3. 2021.03.03 21:00

    비밀댓글입니다

    • BlogIcon plzrun 2021.03.04 12:32 신고

      네 그래도 계속 그렇게 풀다보면 쉬운 DP문제는 조금씩 풀릴거에요. 원래 DP가 제일 어렵습니다. 이제 막 시작하고 1년도 안지났는데 DP문제 풀어제끼고.. 이러는 사람은 정말.. 없다고는 말 못하지만 나라별로 몇명 있지도 않을거에요. 보통 해당 문제가 DP문제인지 아는것부터가 젤 어려운데, 경우의수를 구하라고 하거나 어떤 수로 mod 하라고 하는 경우는 십중팔구 DP문제이기도 해요. 쉬운 DP문제는 DP배열이 의미하는 바가 명확한데, 어려운 애들인 경우 DP배열 자체가 답을 의미하지 않는 경우인 것 같습니다. 정말 계속 풀어보는 수 밖엔 없어요. 일단 제가 말씀드린 문제들만 풀어도 여기 올라온 DP문제는 푸실 수 있을 거에요.

  4. baam 2021.03.04 12:26

    프로그래밍 공부를 이 글을 문제를 보고 따라 시작했습니다. 아직 이런저런 문제를 푸는 단계지만 문제 풀이도 제 개인 블로그에 공부용으로 올릴려고 하는 데 이 글을 참고하고 글을 퍼가도 될까요? 출처는 표시할겁니다.

  5. 2021.03.07 10:40

    비밀댓글입니다

  6. fan 2021.03.07 11:29

    올해 초에 백준을 처음 가입했는데 입출력에서 막히고 이러니까 어떤 순서로 해나가야되는지 막막했습니다. 그래서 이것저것 검색해보다가 이 글을 발견했었습니다. 여기서 추천해주신 문제들 풀어보려고 애쓰다보니(갯수가 많아서 다 풀진 못했지만) 어떤 식으로 해나가야되는지 조금씩 알게 되었습니다. 지금은 어느 새 경험치 1억을 모았습니다. 이 글을 읽지 않았더라면 지금도 한 문제를 하루종일 붙들고 고민하는 걸 미덕으로 생각하면서 배움이 지지부진했을 거 같아요. 좋은 가이드를 제공해주셔서 정말 감사합니다.

    • BlogIcon plzrun 2021.03.13 13:20 신고

      처음 접하게 되면 다들 겪는 문제인 것 같아요. 초중고 국영수과 공부는 정말 제대로 된 자료나 방향 제시해주는 책들이 많았는데, 이 분야는 아무래도 하는 사람이 적다보니까 제대로 방향 제시해주는 사이트도 없는 것 같고, 처음에 길 잘 못들면 많이 헤매거나 하다가 포기하게 되는 것 같더라구요. 아무튼 도움이 됐다니 다행인 것 같네요 ^^ 문제 많이 푸시구 빠이팅 하셔요~

  7. 코린이 2021.03.19 02:18

    좋은 글 감사합니다. 추천해주신 문제 푸는 순서들은 백준 단계별로 풀어보기와 비슷한가요??

    • BlogIcon plzrun 2021.03.19 12:22 신고

      네 비슷합니다. 단계별 풀어보기를 보고 시작하셔도 상관없습니다. 제가 이 글을 쓸 당시에는 백준 사이트에 단계별 풀어보기 같은게 없었거든요. 이 문제들도 5년전 백준 강의에서 풀어본 문제들을 적어둔 거라 단계별 풀어보기와 상당히 겹칠거에요. 저는 해당 문제집 들어가서 보면 MCMF 전까지는 기하쪽 빼면 거의다 푼걸로 나옵니다.

  8. 치맨 2021.03.22 14:16

    안녕하세요. 전기과를 다니며 컴퓨터 공부를 하고있는 비전공자 이며, 언어는 Java로 생활코딩(유투브)으로 두번정도 공부한상태입니다.
    다름이 아니라 이 글을보고 알고리즘(취업을 위한 코딩테스트준비) 공부를 어떻게 해야할지 약간은 알 것 같습니다. 종만북을 보기전 말씀해주신 문제를 푸던 와중에 입출력은 비교적 쉽게 풀었는데, DP부분에서 너무 막막 하더라구요. 지금처럼 풀이 보면서 계속 문제를 풀어야할지, 아니면 알고리즘(힙정렬, 선택정렬 등)과 자료구조의 기본(스택,큐 등)을 먼저 공부하고 문제를 풀어야 할지 고민되어 이렇게 글을 남깁니다. ㅠㅠ

    • BlogIcon plzrun 2021.04.03 13:31 신고

      제가 올려드린 문제는 뭔가 공부를 한다는 느낌보다는 빨리 받아들이고 써야할 도구에 지나지 않다고 생각합니다.
      지금 당장 잘 이해가 되지 않고, 풀라는 문제가 제대로 해결이 안돼서 다음으로 넘어가기 껄끄럽다 생각해도,
      일단 적당히 감만 익히고 넘어가는게 좋다고 생각해요.

      숲을 먼저 봐야 합니다.
      지금 공부하고 있는건 작은 지식일 거에요.
      좀만 더 공부하고 나시면 정말 거대한 숲에서 작은 묘목 하나 보고 있었다는 느낌이 들 겁니다.
      그걸 지금 막 시작하는 단계에서 세부적으로 볼 시간이 없어요.
      크게 한번 둘러보시면 지금 제가 올려드린 문제는 몸이 받아들일 거에요.

      우선은 제가 올려드린 문제를 빠르게 한번 다 풀고, 종만북을 빠르게 한번 다 읽고, 그 다음 진짜로 시작하는겁니다.

      다만, 취업을 목적으로 한다면 종만북까진 읽을 필요가 없긴 해요... 하지만 그렇게 하라고 말씀드리고 싶지는 않네요. 100만큼 지식을 접해봐야 10정도는 제대로 쓸 수 있다고 할까요? 10이 필요하다고 10만큼만 배우면 그게.. 제대로 잘 안써지잖아요?

      좀 추상적으로 답변드린 것 같은데, 핵심은 빠르게 빠르게~ 이건 기본이다 생각하시고 이해 안가더라도 일단 빠르게 빠르게 다음으로 넘어가보셔요. 초반에는 숲을 보는게 중요한 것 같습니다.

  9. 2021.04.06 22:49

    비밀댓글입니다

    • BlogIcon plzrun 2021.04.07 11:45 신고

      어차피 들을거라면 들으면서 문제 푸세요. 강의 시작전에 오늘 강의에 나오는 문제 다 풀고 강의 들으시면 됩니다.

      문제를 다 풀고나면 이미 답도 다 아실테고.. 나름 시행착오를 겪으셨겠지만 어쨌든 다 푸셨으니 크게 강의를 들을 필요는 없다고 생각합니다.

  10. 정말 좋은 글입니다.
    올해 컴공 졸업했지만
    알고리즘을 어떻게 공부해야할지 몰랐는데, 이젠 핑곗거리가 없어졌네요 ㅎㅎ

  11. 0000 2021.04.07 18:03

    0000이란 이름으로 2020.12.21 23:29 이때 댓글단게 엊그제 같은데
    오늘에서야 주어진 문제를 대부분 풀었습니다.
    어떤건 혼자힘으로 힘겹게 푼 문제도 있었고 어떤건 블로그의 도움을 받아야만 풀 수 있었던 문제들이 많았는데 알고리즘을 이런식으로 다양하게 접하다보니 제가 알아서 찾아 푼 문제도 생겼고 코딩관련해서도 내가 아는건데... 이렇게 풀면 되겠는데? 아 이건 이런식으로 돌아가는구나 라는걸 알기 시작했습니다. 한달만에 풀지는 못했지만 그래도 꾸역꾸역 포기하지 않고 풀어냈네요... 이젠 종만북 시작합니다.

    • BlogIcon 0000 2021.04.07 18:05

      3학년이 된 지금 이 블로그를 2학년 겨울방학때 보게 된건 저한테 하나의 큰 전환점이었다는 생각을 합니다

  12. 걱정이 많아요... 2021.04.09 23:30

    위에 언급해주신 문제를 계속 풀면서 어지저찌 이분탐색 문제의 범위까지 왔는데 아직까지 혼자서 해결을 못하는 문제가 많고 계속해서 블로그를 보면서 해결하고 있는 문제들이 대부분입니다ㅠㅠ 계속 이런식으로 블로그를 보면서 문제를 해결하다보니 '나는 왜 혼자서 해결하지 못할까?'라는 생각이 들기도 하고 이렇게 다른 사람의 답을 보고 한줄 한줄 이해하는 방법도 도움이 되는 것인지 의문이 듭니다.

    • BlogIcon plzrun 2021.04.17 15:49 신고

      괜찮다고 생각해요. 저도 그랬습니다.
      뭐 하나 혼자서 풀 수 있는 문제가 없었고,
      답을 보고 넘어갔음에도 나중에 다시 풀려고 하면 안풀리더라구요.
      그래서 보고 또 보고 했었던 적이 참 많았는데
      나중에는 빠르게 한번 다 보고 나니까 자연스럽게 이해되는것들이 많아졌어요.

      알고리즘이 주제별로 여러개가 나뉘어져있지만,
      모든게 다 독립적인건 아니고
      비슷한 주제들을 계속 이것저것 넘나들며 일단 지식을 익히다보면
      자연스럽게 받아들여지는 부분이 있는 것 같습니다.

      이건 알고리즘 뿐만 아니라 다른 공부할 때도 비슷한 것 같아요.
      10만큼을 완전히 알기 위해선 10만큼 계속 자세히 들여다 보는 것 보다는
      100만큼을 빠르게 훑으면 10정도는 자연스럽게 몸이 받아들이는 것과 같다고 할까요?
      또 10만큼만 알면 우물안 개구리처럼 10이 전부라고 느낄텐데,
      100을 빠르게 훑으면 일단 지식을 가로막는 벽이 허물어져 있어서 좋은것 같아요.

      이분탐색 부분까지만 보셨다면, 아직 가야할 길이 멀거에요.
      수학으로 치면 이제 구구단 배우신건데,
      지금 돌이켜 생각해보면 구구단을 뭐 하나하나 오밀조밀 뜯어볼만한 부분은 없었잖아요?
      문제를 풀 때도 그걸 뭔가 이해하고 푸는 느낌도 아니고 그냥 구구단은 구구단이죠..?ㅎㅎ

      또 문제 풀때 하나도 혼자 해결하지 못하겠는건 너무 당연해요
      수학도 정석책 같은거 미분 어떻게 하는거고 적분 어떻게 하는거고 열심히 배워봐야
      나중에 문제 처음보면 바로 풀리던가요? ㅎ.ㅎ
      그래서 문제집만 통째로 사서 진짜 열심히 많이 풀어봐야 실력이 늘잖아요?
      안타깝게도 알고리즘 문제는 수학 문제 푸는 것보다 기본적으로 시간이 너무 많이 걸려요.
      수학 문제집 만큼 문제를 풀어야 우리가 어느정도 능숙하게 푼다라고 생각해봤을 때
      아직 가야할 길이 너무 많습니다.

      이걸 잘 하는 사람이 코딩하는걸 한번 봐야
      여기서 이럴 때가 아니구나..를 좀 뼈저리게 느끼실지도 몰라요.
      그래서 문제를 풀줄 알던 모르던 콘테스트에 참가해보는 것도 참 좋은 방법인 것 같아요.
      저의 위치를 쉽게 알 수 있고, 더 많은 동기부여를 해주거든요.

      아무튼 본론으로 돌아와서! 우선은 그러니 숲을 먼저 크게 보신다음
      한 과목 한 과목 뜯어보시길 권장드려요.
      제 생각은 그렇네요 ㅎㅎ
      너무 걱정하지 마세요. 저는 더 그랬습니다 하핳

    • BlogIcon 걱정이 많아요... 2021.04.21 18:42

      정말 감사합니다. 어떻게 공부할 지 막막했는데 그래도 블로그 보면서 갈피를 어느정도 잡은 것 같습니다!! 아직까지 저엉말 많이 부족하지만 꾸준히 노력해보겠습니다!! 다시 한 번 감사합니다!!!

  13. BlogIcon .log 2021.04.12 21:04 신고

    좋은 글 감사합니다. 나중에 다시 와서 제가 알고리즘과 안맞는건 아닌가 하는 현타가 올 때... 저보다 훨씬 치열하게 공부하신 plzrun님의 글을 보면서 다시 동기부여를 할 수 있겠네요. 감사합니다.

    • BlogIcon plzrun 2021.04.17 15:59 신고

      ^^.. 도움이 됐다니 다행이네요. 예전 글만 치열하지 요즘은 나태해졌습니다. ㅋ_ㅠ 저도 제 글 보고 다시 동기부여 해봐야겠네요. 그럼 빠이팅! 힘내세요~!

  14. KKir 2021.05.01 15:58

    올려주신 문제로 백준에 문제집 만드려고 합니다. 잘 풀게요 감사해요^^!!

  15. ㅇㅇ 2021.05.12 21:14

    먼저 정말 좋은글 감사하단 말을 드리고 싶습니다. 3월 중순에 이 글을 처음 보고 글에서 집어주신 문제들 다 풀고 종만북을 푸는 상태입니다. 종만북에 나오는 문제들 중 난이도 하는 어느정도 풀리는데 난이도 중 이상의 문제들은 건드리기가 힘듭니다 ㅠㅠ 혹시 제가 부족한걸까요? 문제 풀면서 풀이를 많이 참고했는데 종만북 문제 풀면서도 풀이를 참고하는게 크게 달라지는게 없는 것 같아서 조금 슬프네요..

    • BlogIcon plzrun 2021.05.19 00:30 신고

      제가 적긴 했지만, 그 많은 문제들을 정말 짧은 기간안에 다 푸셨군요~! 크으 의지가 정말 대단하시네요!

      계속 혼자 풀 수 없는 문제들로 지쳐가겠지만 그래도 배우기 전을 한번 생각해보시면 힘이 날 거에요.
      아마 코드를 보는 눈이 달라졌겠죠?
      아직 문제를 풀 수 있는 능력은 없지만, 그래도 코드를 보면 똥인지 된장인지 정도는 조금씩 느낌이 올 거에요.
      분명 성장하고 있어요~!

      종만북 문제는 제가 말씀드린 문제보다 훨씬 어려운 문제들 밖에 없어요.
      제가 말씀드린 문제가 초등학교 때 처음 배웠던 방정식 수준이라면,
      종만북 문제는 고3 수능 문제 수준이라고 할까요?
      못 푸는게 당연합니다.

      그리고 종만북을 1독 하는것도 아직 지식 습득 단계입니다.
      여기서 지치시면 안돼요! 아직 갈 길이 멀어요.
      지식 습득 이후에는 더 많은 문제들을 풀어보면서 체화해야 하거든요.
      안타깝게도 지칠 시간도 부족합니다.ㅠ_ㅠ
      종만북을 다 읽으려면 지금까지 문제 푼거보다 훨씬 더 많은 시간이 필요할 거에요.

      자아비판은 잠시 미뤄두고 성장한 부분 떠올려보면서 다시 마음 다잡아 보시길.. ㅎ.ㅎ
      해드릴 수 있는 조언이 이거밖에 없네요.

      힘내세요~!

    • BlogIcon ㅇㅇ 2021.05.22 02:24

      말씀해주신걸 보니 잘못된 방향으로 가고 있었던건 아닌거같네요 plzrun님 덕분에 힘을 낼 수 있을 것 같습니다 감사합니다 ㅋㅋ

  16. 2021.06.02 17:38

    비밀댓글입니다

  17. 2021.06.06 23:43

    비밀댓글입니다

    • BlogIcon plzrun 2021.06.10 21:04 신고

      얼마나 푸셨는지는 잘 모르겠지만..
      일단 종만북을 다 봤다는 가정하에
      유형별로 묶어서 푸는걸 추천드립니다.
      그게 아니라면 아직 지식 습득 단계에 있다고 봐요. 일단은 한번 다 훑는게 중요합니다.
      아무튼 다 보셨다고 가정하고..
      유형 하나를 잡고 그 문제 유형을 잘 풀 수 있을 때까지 푸는거에요.

      일단 유형 하나를 마스터 하면 다른 유형으로 넘어가보구요.

      이렇게 하지 않고 모든 유형이 등장하는 문제들을 처음부터 놓고 풀려고 하면
      아무것도 풀 수가 없을 거에요.

      아직 수능 수학 전 범위를 훑어보지도 못했는데
      확률쪽 미분쪽 뭐 이렇게 2개 챕터보고
      수능 전 범위가 나오는 모의고사 딱 펼쳐놓고 이중에 내가 배운 확률쪽 미분쪽 풀겠다고 하고 있으면
      풀고자 하는 문제가 확률인지 미분인지부터 감이 안오는데...
      풀 수 있을리가 없다고 할까요

      어쩔 수가 없어요. ㅠ..
      저도 처음 시작하고 나서 문제만 보면 어떻게 풀어야할지 생각 자체가 안떠오르던데
      그냥 유형별로 묶어서 많이 푸는게 답인거 같아요.

      이렇게 몇 유형 해결된 것 같으면
      유형별로 좀 섞어서 풀어보고 그러면 도움이 될 것 같습니다.

  18. jjna 2021.06.21 19:10

    언어는 대충 안다는 가정하에 바로 위에 추천해주신 백준문제들로 들어가야한다는 말씀이신가요? 기초 입출력 다음에 바로 dp 문제들을 추천해주신것처럼 문법만 아는상태에 dp dfs dfs 그리디 와 같은 알고리즘적 지식이 전혀없는상태에서 저러한 문제들을 풀 자신이 없어서요 ㅠ
    알고리즘지식이 없이 저런 문제들을 푸는게 가능한지 그게 아니라면 다른사람들의 코드를 보면서 그 개념들을 숙지하고 익숙해지는 과정인건가요? 그리고 알고리즘개념들은 필요할때마다 구글링하면서 찾아보는게 좋나요?

    • BlogIcon plzrun 2021.06.27 11:56 신고

      Q. 알고리즘 지식이 없으면 풀 수 없다?
      결론부터 말하자면 알고리즘 지식이 없으면 문제를 풀 수 없습니다. 하지만 대부분은 풀 수 있을거라 생각하고 덤비죠. 보통은 대학교 가면 언어배우고 바로 알고리즘 배우니까 이 글을 읽는 사람들 대부분은 알고리즘을 모른다고 하기도 애매하거든요. (그걸로는 모르는게 맞겠지만 ^^) 그러니까 풀 수 없는데, 풀 수 있을거라 생각하고 덤벼보고 어..? 잘 안풀리네 하면 문제 푸는 방법을 찾아보고.. 그러면 관련 알고리즘에 대한 설명이 있으니까 그걸 보고 배워보는 시간을 갖는.. 그런 방법을 생각했습니다. jjna님이 말씀하신 방법이 맞습니다.

      Q. 정말 알고리즘을 1도 배운적이 없다면?
      보통 이 글을 읽고 강의를 듣거나 이 방법대로 하거나 그냥 책을 보거나.. 셋중 하나일 것 같은데요. 알고리즘을 한번도 배운적이 없다면, 강의가 베스트이긴하겠죠. 하지만 돈 아끼겠다고 생각하고 다른 방법을 선택한거라면 그만큼 비효율을 안고 가야하는건 어쩔 수 없습니다. 게임이나 현실이나 현질은 강렼하거든요. 아무튼 강의가 부담스럽다면 책을 처음부터 읽는 정공법이 아니라 문제를 풀면서 (풀기를 시도하겠지만 단 1개도 자력으로 풀 수없음에 좌절하는건 비밀) 모르는 부분을 빠르게 습득해 나가는게 포인트입니다. 아무 문제나 푼다면 이 방법이 될리가 없겠지만, 추천해드린 문제를 푼다면 가능할거에요~! 정말 쉬우면서도 기본적인 알고리즘 지식 익히기 좋은 문제들만 있거든요.

      그래서 결론은 문제를 일단 읽고 풀려고 시도를 해보고, 다 자력으로 풀 수 없을테니 구글 검색해서 답을 찾아보며 어떻게 푸는지를 익힌다. -> 올려놓은 문제를 다 풀면 종만북과 같은 책으로 처음부터 보기 시작하면서 좀 더 체계적으로 지식을 쌓는다. -> 이젠 그냥 문제를 많이 푼다.

    • BlogIcon jjna 2021.06.27 18:57

      자세한 답변 정말 감사합니다!
      추천해주신 백준 알고리즘 기초 강의부터 결제해서 중급 강의까지 열심히 해보겠습니다

  19. 초보자 2021.06.26 23:41

    완전 초보인데요, 위 글 내용중 모르는 게 있으면 랭킹 100위권 내 유저의 코드를 보라고 하셨는데,
    코드를 볼 수 있는 방법이 어떻게 되나요?
    이것저것 클릭해봐도 코드를 볼 수 있는 방법이 없네요.
    알려주시면 정말 감사하겠습니다.

    • BlogIcon plzrun 2021.06.27 12:00 신고

      BOJ에서는 문제를 풀지 못하면 푼 사람의 코드를 볼 수 없습니다. 랭킹 100위권 내 유저의 코드를 보라고 말씀드린건, 그런 분들이 운영하는 블로그 같은게 있어요. 랭킹보드 보시면 "상태메세지" 쓰는 곳에 blog하는거 적어두신 분들이 있을 겁니다. 그런데 찾아 들어가시거나, 일단 위에 올려드린 문제들은 기본문제가 많아서 네이버나 구글 검색하시면 답들이 많은데, 그 중에 아이디 보면 랭킹 100위 안에 드는.. 상당히 유명한 사람들 글 위주로 보시면 될 것 같습니다. 문제를 풀고 난 이후라면 당연히 그냥 그분들 코드를 BOJ에서 확인해보면 되구요. (문제 다 풀고 다른 사람들 코드 보는것도 중요합니다. 특히 잘 푸는 사람들이 어떤 생각으로 풀었는지 보는게 중요하거든요.)

  20. 잘하고싶어요 2021.07.01 20:52

    먼저 좋은 글 너무 감사합니다!!! 요즘 알고리즘이랑 괜시리,, 멀어졌는데 다시 열심히 해봐야겠어요!! 추가로, 알고리즘 언어선택에 대한 의견이 있으실까요?.첫 언어를 C로 배워서 자연스럽게 C++로 문제를 푸는데, 요즘은 Python으로 시도하는 습관을 들이고 있어서 고민중입니다. 평소 문제를 읽고 두 언어 중 더 나은걸 스스로 골라서 푸는데,,,말이 골라서 푸는거지,,,,두 언어를 다 잘 다루는건 아니어서요ㅠㅠㅠㅠ 말씀해주신 글 내용대로라면, 숲을보기위해 빠르게 달려야하는데, 언어를 2개로 하는건 매우 바보같은 방법같습니다ㅠㅠㅠ참고로 알고리즘은 대회용이 아닌 이직, 취직 용입니다. 조언부탁드립니다!

    • BlogIcon plzrun 2021.07.04 21:19 신고

      알고리즘 문제를 푼다면 C++로 해야겠죠.
      여기 댓글 중에 Java로 검색해보면 많이 나올거에요.
      제가 많이 언급했거든요.ㅎㅎ
      이건 다른 옵션이 없습니다.

      파이썬으로 문제플 푸는건 코테에서 써먹기 보단 파이썬을 잘 쓰는데 목적을 두면 될 것 같네요.
      언어 익힐때도 문제푸는게 정말 좋거든요.

      취업하기 위해 문제 푸는걸 배운다 하셨으니 그냥 C++로만 하시면 될 것 같습니다.

  21. PS꿈나무 2021.07.06 17:28

    안녕하세요 전번에 댓글달았던 사람입니다!
    정말 plzurn님 덕분에 실력이 엄청 올랐습니다!!

    사실 종만북은 안 봤습니다...ㅎㅎ
    이제 종만북을 보려고 하는데 1권(수치해석, 정수론) -> 2권 -> 1권 순서를 추천하셨는데

    1권에 1장과 2장은 가장 먼저 읽는게 나을까요?

    감사합니다 :)

    • BlogIcon plzrun 2021.08.01 00:12 신고

      안녕하세요. 실력이 많이 올랐다니 축하드립니다 :)
      종만북 보는 순서는.. 그게 알린이때 그 부분을 먼저 읽으면 어차피 눈에도 안들어오고 재미도 없어서 시작도 못해보고 책장으로 책이 들어가는 경우가 다반사라 그 부분은 건너뛰고 재미부터 찾으라고 말씀드린건데, 사실 뭘 먼저 읽든 크게 상관은 없습니다. 다만 지치거나 지루하거나 재미가 없다 싶으면 제가 말씀드린대로 읽으시는걸 추천드립니다.