취업 준비

🧑‍💻 개발자로 취업하기 위한 알고리즘 공부법 2강 공부방법

openingsound 2022. 2. 20. 22:31

 

 2강으로 검색 유입이 많아 해당 글에 안내 문구를 작성 합니다. 

해당 글은 너도나도 개발자 준비를 할 수 있다는 글이 아닙니다!

비전공자로 개발을 업으로 삼기전 본인이 이쪽 길과 맞는지 빠르게 판별 하는 것이 중요하고

저는 알고리즘 공부가 할만하고 코테들을 통과 할 만큼 성과를 보이는 것이 기준이라고 생각합니다. (비전공자 글쓴이의 경험)

개발 분야를 알아보거나 공부하기 전에 알고리즘을 조금씩 해보면서 흥미를 붙이고 (퀴즈 같은 느낌) 언어의 기초를 공부하고 

내가 이길로 취업할 길이 있을까를 판별 하시는걸 추천 드립니다. 

물론 이미 전공이 이쪽이시면 열심히 하셔야 합니다. 최대한 빨리 2~3학년에 때는게 좋을거 같습니다 . (주변인 기준) 

 

너무 바쁘신 게 아니면 1강 가볍게 보고 오시는 거 추천드립니다!! https://openingsound.tistory.com/116https://openingsound.tistory.com/116

 

🧑‍💻 개발자로 취업하기 위한 알고리즘 공부법 1강 코딩테스트

다른 네이버 카페에서 작성하는 글인데 그래도 많은 분께 도움이 되었으면 해서 블로그에서도 같이 진행하려고 합니다. 원글 : https://cafe.naver.com/steamindiegame/4681395 (해당 글과 똑같으니 안보셔도

openingsound.tistory.com

 

관심 있으신 분들이 이렇게 많으니 최대한 연재해 보도록 하겠습니다!

이전 강의에서는 잘못된 공부법과 무엇을 왜 공부해야 하는지에 대해 알아보았습니다.

이번 강의에서는 공부를 어떻게 하는지에 관해 다루도록 하겠습니다!

다음 문단은 1도 모르는 비전공자 분들을 위한 설명이니 전공자이거나 이미 공부를 하고 있으시던 분은 빨간 글씨가 나올 때까지 스크롤 내리시면 됩니다!


1도 모르는 비 전공자

첫 글 스타트를 잘못 끊어서 비전공자 분들이나 IT직군을 고려하시는 분들이 2강을 보실지는 모르겠습니다 ㅠㅠ

작년 초부터 IT기업 연봉인상, 엄청난 복지, 재택근무! 등 화려한 수식어들이 뉴스와 기사를 장식하고 많은 분들이 나도 그럼 한번 해볼까?라는 생각을 가지고 도전을 하고 있습니다.

전향을 하기 위해서 검색을 하거나 유튜브 영상을 시청할 경우 가장 많이 보게 되는 말은

개발자 전향? 적성 맞으면 도전해!

지인에게 나도 개발이나 해볼까?라는 소리를 듣는 분들이 하는 말

아니 적성이 맞으면 전향을 해보라고 하는데 내가 해봐야 적성이 맞는지 알지 무작정 전과를 하거나 퇴사를 하고 공부를 시작하는 건 현실적인 조언이 아닙니다.

여기서 긴 시간을 투자하지 않고 적성이 맞는지 안 맞는지 판별하는 방법이 바로 알고리즘(코테)알고리즘(코테)입니다. 다양한 직무를 선택하더라도 결국 서류의 연장선인 코테는 해야 하고 어떤 개발을 배우더라도 기초가 되는 개념이기 때문에 시간낭비가 아니기도 합니다.

그럼 알고리즘은 어떻게 시작해야 할까요? 가장 먼저 언어를 정해야 합니다. 보통 C++, Python 2개 중에 추천을 하고 저의 경우에는 C++로 시작을 했었습니다. 다만 C언어부터 배워야 하고 직관적이지 않아 초보자 분들이 배우기에는 어려울 수 있습니다. ㅠ 그래도 시간적 여유가 있다면 하시는 것을추천드립니다. 그래도 쉬운 언어로 시작하고 싶다면 python으로 시작하시면 됩니다.

C/C++기초 (1주일 정도)

- 위키독스 : https://wikidocs.net/book/1413     

어차피 책을 사서 보는 거보다 위키독스가 읽기도 쉽고 이후에 까먹은 걸 검색할 수도 있어서 훨씬 편합니다. 기존에는 쿨 프로그래밍 블로그 링크를 걸어 뒀었지만 다음 블로그 폐쇄로 사라져 버림 ㅠㅠ

 

C++ 언어

 

wikidocs.net

일단 3장까지 보시고 문제 풀러 가시면 됩니다.

주의

위에 언어 강의 보다가 너무 재미가 없고 빨리 알고리즘을 풀거나 개발을 시작하고 싶으신 분들 있으실 겁니다. 위의 내용은 영어를 배운다고 하면 알파벳 + 완전 기초 문법을 알려 주는 겁니다. 지금 읽으면 10분 읽고 이해하고 넘어갈 내용을 대충 본다고 중요한 개념들을 놓치면  이후 문제 풀 때 1시간 이상을 고민하고 검색을 하다가 시간을 날릴 수 있습니다. 기본적인 언어 공부는 하고 시작합시다!!

 

 

 

언어 하나를 공부하셨거나 이미 알고 있으신 분은 배운 간단한 문제를 풀면서 언어를 어느 정도 익숙해지시는 게 좋습니다. 백준 사용법도 구글에 치시면 나옵니다!

문제집 : https://www.acmicpc.net/step (12에 정렬까지 푸시면 됩니다)

 

 

공부를 하시다가 막히거나 질문이 생기시면 구글에 검색해서 공부하시면 됩니다! 아니 다 구글에 치라고 하고너무 불친절하다고 생각하실 수도 있는데 이 부분까지 포함을 해야 내가 적성에 맞는지 알 수 있는 부분입니다!

아니 진짜 비전공자인데 이런 커리큘럼을 따라서 한다고 될까? 생각하실 수도 있지만 저도 위의 방법으로 했습니다. 알고리즘 공부를 하시면서 적성에 맞는 거 같다고 생각이 되시면 (공부를 하시면 자연스럽게 알게 됩니다.) 코테 합격권까지 공부를 하시고 FE, BE와 같은 직무를 선택하시고 공부를 하시면 됩니다!


알고리즘을 공부할 때의 마음가짐

최근 solved.ac (알고리즘 문제를 통해 티어를 측정하게 해 줌)의 등장으로 더 심각해진 문제가 있는데 바로 백준 티어가 높으면(문제를 많이 풀기만 한다면) 본인의 실력이 상승한다고 생각하는 겁니다. 

백준 골드 5인데 코테는 프리패스인가요?, 100문제 풀었는데 코테 공부 더 해야 할까요?

solved.ac에 존재하는 경험치가 진짜 본인의 실력이라고 생각하는 분들

 

코테를 통과하신 분들 중에 골드 5 찍고 100문제를 푸신 분들이 있을 수도 있겠지만 대부분의 경우 그렇게 접근을 하시면 안 됩니다!

주객전도가 되면 안 되는데 여러분이 알고리즘을 공부하는 이유는 코딩테스트를 합격하기 위해서입니다! 경험치나 레벨을 올리기 위해서가 아닙니다.

세상은 게임이나 왁물원이 아니어서 문제를 풀어 경험치, 레벨이 높다고 코딩테스트를 합격할 확률이 커지지 않습니다. 문제를 풀면서 실제로 상승한 여러분의 보이지 않는 실력에 따라 갈리게 됩니다!! 주객전도가 되어서 문제수 늘리기, 티어 올리기를 위한 문제 풀기를 하지 않는 것이 중요합니다.

뭔 소리야! 문제를 많이 풀면 경험치가 올라가고 실력이 늘어나는 상관관계를 가지는 거 아닌가?라고 생각하실 수 있는데 다른 사람들보다 훨씬 적은 수의 문제를 밀도 있게 풀고 성장하는 방법이 있습니다.

계속해서 말하지만 적은 수의 문제를 풀더라도 중요한 것은 여러분의 순수실력이 증가하는 것이 가장 중요합니다!

우리가 공부해야 하는 알고리즘들

시간 복잡도 -> 완전 탐색 -> 그리디 -> 분할 정복(재귀) -> BFS, DFS (기초) -> DP(초급) -> BFS, DFS, 여러 그래프 자료구조 -> 최단 경로 -> 이분 탐색(조금 더 앞에 해도 됨) -> 슬라이딩 윈도, 투 포인터 -> 유니온 파인드, 최소 스패닝 트리(MST) -> 위상 정렬(잘 안 나오긴 하는데 알면 좋음)

여러분이 일반적으로 코딩테스트 합격 안정권(네카라쿠배 포함)을 노리시면 공부하셔야 되는 것들이고 이분탐색까지 공부하셔도 일반적인 IT기업들의 통과 컷을 아슬아슬하게 맞추실 수 있게 될 겁니다. (나온 문제들을 거의 다 푼다면)

1강에서 보여드린 것처럼 완전탐색에서 시간 복잡도를 줄여 나가는 방식으로 문제에 접근하는 것이 편하기 때문에 위의 순서대로 알고리즘들을 공부를 하시는 게 좋습니다. (이후에 더 자세하게 설명할 예정입니다.)

무조건 시간복잡도부터 공부하셔야 됩니다!

개인적으로 추천하는 개념 블로그들 라이 블로그, , 안즈 블로그를 보시면 됩니다. 이전에도 말했지만 알고리즘 개념 자체는 몇 개를 제외하고는 진행하지 않을 예정입니다. 이미 작성된 너무 좋은 글이 많아요!

새로운 알고리즘 배우기

이제부터 하는 내용들이 사실상 강의를 작성하게 된 이유이고 아무리 말해도 사람들이 듣지 않는 가장 중요한 부분입니다.

대부분의 사람들이 새로운 알고리즘을 풀 때 일단 문제를 풀기 시작하시는데 이는 좋지 않은 방법입니다.

1. 블로그, 책에서 알고리즘 공부하기

가장 먼저 해당 알고리즘을 언제 쓰는지를 배워야 하고 시간복잡도가 어떻게 되는지 이해하셔야 합니다.

알고리즘이라는 것은 막일과 비교해서 시간과 공간을 더 효율적으로 쓰기 때문에 만들어졌습니다. (예시 : 1부터 100까지 더하기를 하나씩 100번 더하는 것을 (1+100)*100/2 왕같이 한 번에 풀어버리기)

우리가 문제를 접하고 푸는 방법도 완전탐색(슈퍼 노가다)로 문제를 푼다고 생각을 하고 알고 있는 알고리즘을 대입해서 어떤 알고리즘을 적용하는 것이 좋을지 선택해야 하기 때문에 이론에 대한 이해와 사용하는 경우를 인지하는 것이 중요합니다!

개념을 잡으셨다면 이제 알고리즘을 구현한 코드를 보셔야 합니다. C++을 사용하시는 경우 위의 블로그들 보시면 있습니다.(좋은 블로그 대부분은 C++로 쓰인 곳이 많아서 C++추천드립니다! 구글로 검색해 보시면 Python으로도 정리가 잘된 블로그들이 있을 겁니다.!) 구현되어 있는 코드를 보시면서 살짝 부족했던 알고리즘 이해나 시간복잡도를 계산하시고 코드를 외우기보다는 어떤 순서를 통해 작동하는지 이해하시는 게 중요합니다.

보통 간단한 문제들이 같이 포함되어 있는데 작성되어 있는 코드를 보지 않고 스스로 코드를 작성할 수 있을 정도면 됩니다.

2. 해당 알고리즘 문제들 몰아 풀기

간혹 알고리즘 공부를 하실 때 백준이나 프로그래머스에 들어가 재밌어 보이는 문제들을 하나씩 랜덤으로 골라 푸시는 분들이 있습니다. 물론 본인이 미리 알아야 하는 알고리즘들을 다 공부를 했다면 필수적으로 해야 하는 과정이지만 아직 이 강의를 듣는 분들이라면 이런 방법은 효율적이지 않습니다.

다시 한번 말하지만 여러분은 코테를 통과하기 위해 알고리즘을 공부하시는 중입니다. (물론 대회를 노리시면 더 좋습니다)

그리고 코테의 특징은 문제가 어떤 알고리즘인지 알려주지 않는다는 거죠 그래서 여러분들은 문제를 읽고 어떤 알고리즘인지 알아차리는 능력을 키우셔야 합니다. (완전탐색에서 시간복잡도로 알고리즘을 추측하는 것과는 별개입니다.)

해당 능력을 키우기 위해 하나의 알고리즘을 정해 놓고 최소 10문제 정도를 난이도를 높여가며 이어서 푸는 게 좋습니다. 결국은 다른 문제이지만 하나의 알고리즘을 다루고 비슷한 난이도의 문제이기 때문에 지문에 공통적인 흐름이 존재하게 됩니다. 지문의 소재(이야기), 입력값들의 범위, 출력 등은 다를 수 있지만 문제를 풀기 위한 알고리즘은 동일하고 이를 은연중에 나타내는 지문, 조건에는 공통점, 특징들이 존재하게 됩니다.

2~3개의 문제를 푼다고 감이 잡히지는 않지만 8~10번 째의 문제를 이어서 푸신다면 대략 어떤 느낌인지 아시게 될 겁니다. 단 문제를 띄엄띄엄 풀게 된다면 의미가 없으니 최소 1주일 정도에 하나의 알고리즘을 몰아서 푸는 게 좋을 거 같습니다. (저는 2~3일 정도에 하나씩 했었습니다)

이어서 풀면서 아직은 미숙한 구현 실력을 키울 수 있게 됩니다.

단 이렇게 문제들을 몰아서 풀 때 중요한 게 있는데 바로 좋은 문제들을 선정하는 것이 중요합니다. 좋은 문제는 문제의 지문에 오류가 없고 억지스럽지 않으며 구글에 검색을 했을 때 좋은 블로그 풀이 가 있는 문제들입니다. 선정기준은 푼 사람이 최소 2000개 이상으로 잡으시면 편한데 이것도 처음이라면 어렵기 때문에 라이 블로그, , 안즈 블로그 의 알고리즘 설명 하단에 문제들이 포함되어 있으니 찾아서 풀어보시면 됩니다!

아니면 프로그래머스의 문제의 경우 정리가 잘되어 있기 때문에 몰아서 푸시는 거도 좋습니다.

3. 코딩을 하기 전에 무조건 설계하기

문제를 읽고 조건을 확인한 후 문제가 나에게 요구하는 것이 뭔지 똑바로 이해를 하는것이 가장 중요합니다. 이후 종이와 펜으로 설계를 한 후 (물론 패드를 사용하셔도 됩니다) 코딩은 설계한 내용을 받아쓰기하듯이 옮기시면 됩니다.

해당 부분은 사실 글로 봐서는 감도 잘 안 오는데 매우 중요하기 때문에 다음 강의로 만들겠습니다.

4. 다른 사람의 코드 읽기

캬! 문제 풀었고 다음문제 가보자! 절대 안 됩니다. 아직 더 빠르게 성장할 수 있는 비결이 있습니다 그럼 도대체 뭘 해야 할까요?

바로 다른 사람의 코드를 확인하는 것입니다. (이 부분 때문에 백준에서 진행을 하는 게 좋습니다. )

채점 현황 -> 사용한 언어 -> 맞았습니다.

문제를 푸시고 채점 현황에 가서 채점 현황 -> 사용한 언어 -> 맞았습니다. 를 선택 후 검색을 하셔야 합니다. 이렇게 할 경우 다른 사람들이 제출한 코드를 보실 수 있습니다.(해당 문제를 푼 경우에만 가능)

파란색으로 된 C++부분을 클릭하시면 됩니다.

 

 

파란색으로 되어 있는 부분만 코드를 확인할 수 있는데 이는 문제를 푼 사람이 본인의 백준 계정 설정에서 코드 공개로 설정을 해 주셔야 합니다. 다른 사람들과 함께 성장하기 위해 열어 주시는 습관이 좋습니다. (다른 사람이 코드보고 가면 기분도 좋아요!)

여기서 최소 3개의 코드를 보셔야 합니다. 다른 사람의 코드를 봐서 얻게 되는 장점이 뭐가 있을까요?

문제를 방금 막 푼 여러분과 저기 있는 분들은 같은 문제, 같은 조건, 같은 입력, 같은 출력의 조건에서 코드를 작성하였습니다. 하지만 시간과 코드의 길이에서는 꽤 크게 차이가 나게 됩니다. (메모리는 지금은 중요하지 않습니다)

둘 다 일반적으로 짧을수록 더 잘 작성된 코드입니다. 그래서 여러분의 제출한 코드보다 시간과 코드 길이가 더 짧은 풀이가 있다면 보고 배우시면 됩니다. 코드를 클릭하셔서 한번 읽어 보면 됩니다.

일반적으로 다른 사람의 코드를 읽게 되면 전혀 읽히지 않는 게 정상입니다. 하지만 지금 여러분은 막 해당 문제를 풀고 왔고 알고리즘이 머릿속에 있기 때문에 처음 보는 사람의 코드를 읽더라고 수월하게 읽히게 됩니다.

분명히 같은 결과지만 더 기발하고 효율적으로 작성한 코드들을 찾게 되실 거고 이해하시고 본인의 것으로 만드셔야 합니다.

 

다른 사람의 코드를 보지 않았더라면 그러한 효율적인 방법을 스스로 생각하고 이해하기까지는 10문제 20문 제도 부족할 수 있습니다. 하지만 문제를 풀고 다른 사람의 코드를 보는 것만으로도 엄청난 가성비 성장과 이해를 할 수 있습니다.

물론 코드를 보기만 하는 게 아니라 새롭게 배운 방법을 토대로 코드를 새로 짜서 제출을 하셔야 합니다. (이전 코드 싹 다 지우고)

이렇게 하나의 문제를 한 번만 푸는 게 아니라 2~3번을 점점 나은 방식을 통해 풀면서 새로 익히는 알고리즘에 대해 더 깊은 이해를 하게 되고 구현 능력도 더 빨리 키우게 됩니다.

 
하나의 문제를 9번이나 풀기

 

위의 사진은 제가 실제로 제출한 기록인데 해당 문제의 경우 최적화 방법을 계속해서 찾게 되어 9번의 수정을 거듭하였고 엄청난 시간복잡도 감소와 코드길이 감소를 할 수 있었습니다. (코드 길이는 앞에 쓸모없는 부분이 많아서 실제 작동 부분이 매우 깔끔해짐 820ms -> 76ms )

이렇게 하나의 문제를 씹고 뜯고 맛보면서 여러 분이 가져갈 수 있는 지식을 최대한으로 땡겨서 가져가야 합니다. 비록 다른 사람보다 다음문제로 넘어가기까지의 시간은 더 걸리겠지만 같은 시간대비에는 말도 안 되는 실력 향상이 있을 겁니다.

여기서 코드를 보는 게 아니라 맞힌 사람으로 가게 되면 숏코딩숏코딩 들도 있는데 지금은 도움이 되지 않고 오히려 해가 되니 안 보는 것을 추천드립니다. 변태적인 코드고 실제로 적용하기엔 힘들 코드들이 많아 악영향이 있을 수 있습니다.

5. 문제를 풀지 못한 경우 ㅠ

열심히 문제를 풀려고 노력했지만 결국 풀지 못하는 경우가 분명 있습니다. 이렇게 될 경우 몇 시간까지 투자를 해야 할까요? 개인적인 생각으로는 1시간입니다.

어떻게 풀지 아예 감도 안 오는데 1시간이 지나갔다면 구글에 해당 문제 번호를 검색 한 뒤 맨 위에 뜨는 글을 클릭합니다. 이렇게 되면 매우 높은 확률로 상단에는 문제 설명, 중단에는 작성자의 풀이(설계), 하단에는 작성자의 코드 가 적혀 있게 되고 풀이를 본 후 다시 설계를 하러 가셔서 푸시면 됩니다. (코드까지는 한 번에 안 보시는 걸 추천드립니다)

혹은 설계는 했는데 아니면 풀이는 봤는데 코드로 작성을 못하겠다! 하시는 분들은 하단의 코드를 보고 이해하시면 됩니다. 코드를 보면서 그대로 치는 것은 추천드리지 않습니다. ㅠ

블로그 풀이의 코드까지 봤는데도 이해가 안 되고 코드도 못 치겠다! 하시는 분들은 안타깝지만 해당 알고리즘을 이해하시지 못한 상태입니다. 다시 첫 부분인 1. 블로그, 책으로 알고리즘 공부하기로 가셔서 개념공부를 하시면 됩니다.

물론 본인이 시간이 많고 내 힘으로 풀고 싶다 하시는 분들은 1시간을 넘어 2시간 까지 고민을 하셔도 되는데 그 이상으로는 추천드리지 않습니다. 그렇게 넘어갈 경우 집중이 이미 깨진 상태이고 흥미도 떨어져 공부의 효율이 나빠지게 됩니다.

그럼 1시간 미만으로 보는 건 어떨까요? 이건 추천드리지 않습니다. 실제 코테 환경에서 마지막 문제를 풀게 되면 본인의 실력에서 거의 아슬아슬한 문제일 확률이 높습니다. 이런 경우 기본적으로 문제를 고민하는데 1시간 정도를 고민하는데 이렇게 장시간을 고민하는 것도 훈련을 해 놔야지 실전에서 문제를 풀 수 있습니다.


사실 이렇게 적긴 했는데 저도 위 방법대로 다 따르면서 공부한 건 아닙니다. 하지만 새로운 알고리즘을 배우는 동안은 매우 좋은 방법입니다!

이번강의에서는 새로운 알고리즘을 본인이 습득하는 사이클을 알아보았습니다. 다음 강의에서는 설계하는 법과 알고리즘 습득 후 공부 방법에 대하여 다뤄보겠습니다!

 

↓↓↓↓↓↓설계하는 법과 알고리즘 습득 후 공부하는 방법 ↓↓↓↓↓↓

https://openingsound.tistory.com/118

 

🧑‍💻 개발자로 취업하기 위한 알고리즘 공부법 3강 알고리즘설계

1강과 2강이 많은 분들께서 좋아해 주셔서 감사합니다! 이 공부법이 처음에는 시간대비 더 적은 문제를 풀고 더 많은 알고리즘을 배울수는 없겠지만 여러분의 순수 실력은 정말 빠르게 늘게 되

openingsound.tistory.com