Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Kanghyeon Kim's Development

문제풀이(Problem solving)위주의 개발 공부 시작하기 본문

Algorithm (feat. Baekjoon Online Judge)

문제풀이(Problem solving)위주의 개발 공부 시작하기

Kanghyeon Kim 2022. 3. 13. 16:20

처음 "개발"이라는 것에 관심을 가지기 시작한 입문자들에게 조금 더 앞선 입문자로서 나는 이런 이유로 이렇게 공부하기로 했다는 이야기를 나누기 위해 작성하였습니다. 혹시 다른 의견이나 공유해주실 이야기가 있으시면 댓글 부탁드려요:) 자세한 내용은 키워드를 가져가서 "(??? ex. PS 공부, 알고리즘 공부, 앱 개발) 시작하기"로 구글에 검색하시면 많은 훌륭하신 선배님들께서 공유해주신 내용이 있으니 참고 부탁드립니다. 여기서는 제 선택에 대한 전반적인 흐름만을 말씀드릴 예정입니다.


개발자가 되기 위한 공부는 크게 3 가지로 나눌 수 있다.

1. 이론 공부(강의, 교과서, 등)

2. 프로젝트 위주의 공부

3. 문제 풀이 위주의 공부

 

보통 컴퓨터 공학과, 전산학과 등의 전공자들은 학교에서 1의 이론 공부를 하고,

그 후 각자 2(프로젝트)나 3(문제 풀이)을 하면서 커리어와 함께 (혹은 그전에) 실력을 쌓기 시작한다.

 

먼저 2의 프로젝트 위주의 공부에 대해서 말하자면, 개인 프로젝트를 진행하는 개발자들도 상당수이지만, 학생 중에서는 주로 주변에 함께 개발을 하는 친구들이 많거나 (전공자) 공모전, 대회 등에 나가거나 회사 등의 단체에서 특정 팀에 속하게 되는 경우에 일반적으로 경험하는 개발 과정이다.

해당 프로젝트의 목적을 달성하기 위하여, 필요한 기능을 구현하기 위하여 목적지향적인 공부를 하게 되는 것이 그 특징이며, 그 과정에서 방대한 검색을 바탕으로 공부를 하게 되며 적어도 그 기능 구현, 사용했던 알고리즘이나 함수에 대해서는 빠르고 자세히 알게 된다.

본래도 프로그래밍은 자기 주도적인 공부가 중요한 분야이지만 (전공자들이 대학에서 이론 공부를 한다지만 실제로는 구글링에 의존해서 공부하고 대학은 공부할 주제와 방향성, 동기부여를 제공함과 동시에 시험, 과제 등을 통해 자신의 성취를 확인할 수 있다는 데에 그 의미가 있다고 볼 수 있다.), 그중에서도 프로젝트 위주의 공부는 그 정도가 더 크다고 할 수 있다. 특정 단체에서 주최하는 competition이 아니라면, 프로젝트의 시작부터 평가와 끝맺음까지 모두 개인(혹은 팀)에게 달려있다.

 

3의 문제 풀이 위주의 공부는 흔히 온라인 저지(Online Judge)를 통해서 하는, 대회(Online contest) 성적이나 입사 코딩 테스트를 위한 공부를 말한다. 여기서 말하는 문제라 함은 특정 input에 대하여 원하는 output이 나오도록 하는 알고리즘의 구현 문제를 말하며, 주어진 시간과 메모리 자원 안에서 최대한 효율적인 알고리즘을 찾아내는 것이 그 목적이다. 분야와 상관없이 프로그래밍/컴퓨팅적 사고를 하기 위해 기본적으로 필요한 머릿속의 추상적인 개념, 생각을 소스코드로 전환하는 구현력과 함께 기본적인 자료구조, 기초 알고리즘들, 문제 해결 기법/패러다임 등을 익히고 적용할 수 있기 때문에, 일반적으로 개발자 구직에서 이들을 확인하는 코딩 테스트를 거치게 된다. 이런 기본적인 입사 코딩 테스트 정도의 수준을 목표로 하는 취준생들이 많지만, 심화적으로 들어가서 PS 분야 자체를 즐기고 대회 수상을 목적으로 공부하는 사람들에겐 PS가 위에 언급된 기본적인 구현력과 알고리즘 소양과 더불어 정말 말 그대로의 문제 풀이가 되어 수학의 정수론, 대수학 등과 밀접한 관련을 가지게 되면서 현실의 문제를 효율적으로 해결할 수 있는 솔루션(소스 코드로 표현된)을 찾고자 하는 하나의 학문과 같은 위상을 갖게 된다.

 

비전공자의 경우, 기초적인 코딩(기본 언어와 문법)을 책이나 위키독스, 온라인 수업 등을 통해 익힌 후 선택의 기로에 놓이게 되는데, 너무나 할 것이 많기에 무엇부터 할 지 막막하게 느껴질 것이다. 여기서 잠시 감히 조언을 한다면, 개발을 시작한 이유가 하나의 스킬을 기본기라도 익히거나 개발자란 직업을 고려해보기 시작하는 단계라면 문제 풀이 위주의 공부를 하면서 그에 필요한 이론들을 공부하는 것을 추천한다. 문제 풀이(PS)를 하면서 얻게 되는 개념들은 전공자의 이론 공부에서는 전공 2,3학년때 배우는 자료 구조, 이산 수학/구조, 알고리즘 개론에 속하게 된다. 더 자세한 공부법은 인터넷에 많이 공개되어 있으며 몇 개의 레퍼런스를 추천하면 아래와 같다. https://subinium.github.io/how-to-study-problem-solving/, https://baactree.tistory.com/52, https://koosaga.com/217.

 

만약 개발을 하고 싶은 분야가 프론트 엔드/백 엔드, 앱/웹 서비스 개발 등 구체적으로 정해져 있는 상태라면, 문제 풀이 위주의 공부와 병행하여 해당 소분야로 검색을 하여 직접 적절한 언어, 프로그램을 선택하여 개인 프로젝트를 해보는 것을 추천한다. 개인 프로젝트를 먼저 바로 시작하고자 하는 의욕이 있을 수도 있고 실제로 구글링을 통해서 어떻게든 배우면서 원하는 것을 구현해낼 수 있겠지만, 프로젝트를 통해서 얻어내고자 하는 결과물에 대한 욕심이 있다면 기본적인 자료 구조, 알고리즘 기법에 대한 이해와 적용이 필수적이고 이를 빠르게 습득하면서 이해도를 확인할 수 있는 수단이 문제 풀이라고 생각한다.


 

현재 나는 이산 구조, 자료 구조, 알고리즘 개론 전공 수업을 모두 수강한 상태에서 인공지능 로봇 구동 자율 프로젝트, 앱 개발(프론트 엔드, 안드로이드 스튜디오)을 경험한 상태에서 입대한 상황이다. 현재 진로를 디바이스 제작과 데이터 프로세싱/머신 러닝 쪽을 고민하던 중 매번 초기화되고 성능이 좋지 않은 사이버지식정보방(싸지방) 컴퓨터로 할 수 있는 공부 중 가장 적절한 것이 미뤄왔던 문제 풀이라고 생각하였다. 취업, 대회 수상 등 거창한 것을 떠나서 단순히 컴퓨팅적 사고력과 이전에 기술한 기초적인 개발 교양을 유지하고 갈고 닦기 위함이 가장 큰 목적이다. 진로를 개발 쪽으로 가게 된다면 필요한 부분을 공부하는 것일테고, 그것이 아니라면 평생 가질 취미로 생각하고 있다. 군대에 와서 알게 된 것 중 하나는 내가 어떤 것의 효율을 극대화하고 해결하는 것에 큰 쾌감을 느끼는 사람이다라는 사실이다.

 

구체적인 방법으로는 국내에서는 가장 유명한 백준 온라인 저지를 기본적으로 활용할 생각이다. 개인적으로 가장 백준 사이트에서 아쉽게 생각하는 것은 처음에 어떤 문제들을 풀지가 막막하다는 점이다. solved.ac와 단계별 풀기란 카테고리가 있지만 그럼에도 큰 장점이기도 한 방대한 문제 양 때문에 나처럼 처음부터 모든 것을 배워나가기 보단 빠르게 이전에 배운 것들을 복습하는 단계가 필요한 사람에게는 막막한 것이 사실이다. 인터넷에서 문제 푸는 순서를 추천받기 위해 찾아보던 중 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 에 나온 문제들을 우선적으로 풀면서 기본적인 자료구조와 알고리즘 기법들을 복습하려고 한다. (백준 사이트 문제집으로는 https://www.acmicpc.net/workbook/view/7730, https://www.acmicpc.net/workbook/view/7731 로 정리되어 있으니 참고 바란다.) 그 후에는 종만북이나 solved.ac에서 재밌어 보이는 문제들을 골라 푸는 방식으로 일단은 1일 1백준을 유지하면서 플레티넘 티어에 도달하는 것을 1차 목표로 하였다. 그후에는 백준 문제 외에도 백준 내에서의 대회, codeforce/leetcode를 시작할 생각이다.

 

이 모든 과정에서의 코드는 github, https://github.com/zero0kkh/Problem-Solving-with-Baekjoon 에 기록할 예정이다. 그리고 어느 정도의 유사한 카테고리의 문제들이 쌓인 후에, 내 풀이 과정과 다른 풀이들과의 비교, 사용된 이론과 개념들을 정리하는 게시물을 이 블로그에 올리고자 한다.

 

ps. 추가적으로 나와 유사하게 군대에서 PS 공부하는 사람들을 위해 내 코딩루틴과 함께 두 가지를 추천해주자면 replit과 desktop github이다. replit은 in-browser IDE이고 여러 언어를 지원한다. (https://replit.com/)백준 사이트와 함께 replit을 열고 문제풀이를 진행한 뒤, 메모장에 복붙한 뒤 txt 파일을 desktop github에 따라 clone되어 있는 폴더에 생성하는 식으로 공부한 뒤 push를 하면서 공부를 끝낸다.

 

ps2. 나는 Python을 주언어로 사용할 예정이다. 기존에 C, C++, JAVA, Python을 다룬 적이 있지만 Python이 가장 pseudo code에 가까운, 직관적인 언어이기 때문에 기억을 되살리고 구현 속도가 빠르기 때문에 이를 선택하였다. 다만 이는 내 목표가 PS에서 정말 좋은 output(최단 시간, 메모리 최적화)가 아니라 알고리즘, 아이디어를 목표를 하기 때문에, 대회 수준의 PS는 욕심이 없기 때문에 Python을 선택을 한 것이다. 만약 욕심이 있고, C 언어에 익숙하다면 C 언어로 PS를 시작하는 것을 권장하며, 나 또한 가끔 Python으로는 리소스 제한이 빡빡한 경우 혹은 그런 단계가 되었을 때는 C 언어로 다시 코딩할 생각이다.

Comments