알고리즘 공부 | 개발자라면 \”무조건\” 알고리즘 공부를 해야할까? 170 개의 가장 정확한 답변

당신은 주제를 찾고 있습니까 “알고리즘 공부 – 개발자라면 \”무조건\” 알고리즘 공부를 해야할까?“? 다음 카테고리의 웹사이트 https://you.maxfit.vn 에서 귀하의 모든 질문에 답변해 드립니다: https://you.maxfit.vn/blog/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 노마드 코더 Nomad Coders 이(가) 작성한 기사에는 조회수 140,949회 및 좋아요 8,855개 개의 좋아요가 있습니다.

알고리즘 공부 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 개발자라면 \”무조건\” 알고리즘 공부를 해야할까? – 알고리즘 공부 주제에 대한 세부정보를 참조하세요

이름만봐도. 숨이 턱 막히는것같은…알고리즘 그리고 데이터 구조…
새로운 시리즈를 시작해봅니다. 허허….할 수 있을까요?
구독과 좋아요로 응원해주세요 -0-!

📌 니콜라스와 무료로 코딩 공부하기
https://nomadcoders.co

알고리즘 공부 주제에 대한 자세한 내용은 여기를 참조하세요.

[Algorithm] 알고리즘 공부 시작 방법 및 순서

초보자 입장에서 알고리즘 공부를 시작하고 싶어서 뭐부터 해야 좋을지 조사하다가, 자료가 좀 모여서 포스트를 작성하게 됐다.

+ 더 읽기

Source: blog.yena.io

Date Published: 6/18/2021

View: 1612

알고리즘 공부 순서

알고리즘 공부 순서. 1. 프로그래밍 기본 문법 공부. – 기본서를 사셔도 좋고, 유튜브 영상보고 독학 하셔도 좋고, 다양한 방법으로 기본 문법 정도만 …

+ 여기에 자세히 보기

Source: patiencelee.tistory.com

Date Published: 1/3/2021

View: 422

알고리즘 공부 방법 – velog

코드업: 기초 100제백준 온라인 저지: 삼성코드포스 – 블루레벨 정도의 실력까지.탑코더 알고리즘 튜토리얼: 초심자 추천프로그래머스: 카카오알고 …

+ 자세한 내용은 여기를 클릭하십시오

Source: velog.io

Date Published: 2/15/2021

View: 5088

알고리즘 공부를 어떻게 시작해야할까? (Feat. 백준 500문제 푼 …

안녕하세요? 코딩중독입니다. 어제 “백준 6219번 소수의 자격” 문제를 풀었고, 이것이 저의 500번째 푼 문제가 되었습니다. 알고리즘 공부를 어떻게 …

+ 여기에 더 보기

Source: steady-coding.tistory.com

Date Published: 5/16/2022

View: 1205

프론트엔드 개발자에게도 알고리즘 공부가 중요할까? | 요즘IT

하지만 알고리즘 코딩 테스트는 여전히 많은 기업에서 실재(實在)합니다. 지금으로부터 약 1년 전, 저 역시 복학을 앞둔 상황에서 처음 알고리즘 공부를 …

+ 여기에 더 보기

Source: yozm.wishket.com

Date Published: 5/6/2021

View: 9639

알고리즘 공부 사이트 정리 – HelloSpring

알고리즘 공부 사이트 정리 · CodeUp · SW Expert Academy · solved.ac · 프로그래머스 · LeetCode – The World’s Leading Online Programming Learning …

+ 여기에 보기

Source: aspring.tistory.com

Date Published: 1/23/2022

View: 7717

자료구조, 알고리즘 공부를 시작하려 한다면… – 궤도

이 글은 2021년 8월부터 12월까지 진행된 코딩테스트 대비 알고리즘 튜터링 알튜비튜의 회고글입니다. 코딩테스트 때문에 알고리즘 공부는 해야겠는데 …

+ 여기를 클릭

Source: myunji.tistory.com

Date Published: 7/25/2021

View: 5268

초심자의 알고리즘 공부 순서 (코딩테스트 합격하기!)

프로그래밍 언어 기본 문법 공부 : C++, C언어, Java, Python. 2. 알고리즘 기본 100제 문제 풀이. – 사이트 : 백준, 코드포스, 프로그래머스, 탑코더.

+ 여기에 표시

Source: m.blog.naver.com

Date Published: 11/15/2022

View: 3678

코딩테스트 준비(알고리즘 공부) 커리큘럼 – 영화로운날

자료구조 = 식재료 , 알고리즘 = 요리. 식재료가 있어야 요리를 한다. 자료구조부터 공부하고 알고리즘 공부하자!

+ 여기에 표시

Source: glory-day.tistory.com

Date Published: 2/24/2021

View: 7796

주제와 관련된 이미지 알고리즘 공부

주제와 관련된 더 많은 사진을 참조하십시오 개발자라면 \”무조건\” 알고리즘 공부를 해야할까?. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

개발자라면 \
개발자라면 \”무조건\” 알고리즘 공부를 해야할까?

주제에 대한 기사 평가 알고리즘 공부

  • Author: 노마드 코더 Nomad Coders
  • Views: 조회수 140,949회
  • Likes: 좋아요 8,855개
  • Date Published: 2021. 5. 30.
  • Video Url link: https://www.youtube.com/watch?v=9TyyMtlk5i4

PatienceLee :: 알고리즘 공부 순서

이번 포스팅에서는 알고리즘 공부 순서를 정리해보고자 합니다. 이는 누군가에게는 맞지 않을 수 있으며, 지극히 인터넷에 돌아다니는 영상이나 사이트들을 참고하여 작성한 것이니 참고만 해주시길 바랍니다.

처음부터 막힘없이 풀 수 있다면 좋겠죠.

그런데, 못 풀 수도 있어요.

좌절하지 말고, 해결책을 찾아보더라도

최대한 문제를 많이 보고

익히는 것에 집중합시다!!

알고리즘 공부 순서

1. 프로그래밍 기본 문법 공부

– 기본서를 사셔도 좋고, 유튜브 영상보고 독학 하셔도 좋고, 다양한 방법으로 기본 문법 정도만 익혀줍시다. 준비운동이라고 생각해주시면 됩니다.

– 전자책: 위키독스_점프 투 파이썬

2. 코드업: 기초 100제

– 기본 문법을 어떻게 사용하는가?를 기초로 익혀볼 차례입니다. 코드업에 기초 100제를 풀어줍시다.

3. 백준_단계별로 풀어보기(1단계~11단계)

– 본격적인 몸풀기입니다. 11단계까지는 기본으로 풀어줍시다.

4. 백준_알고리즘 기초 1/2

– 슬슬 알고리즘 본 게임 들어갑니다. 강의도 들으시면 좋겠지만, 저는 커리큘럼에 나온 문제들만 풀어보고자 합니다.

포함되어 있는 문제

200 – 자료구조 1

201 – 자료구조 1 (연습)

203 – 자료구조 1 (참고)

300 – 수학 1

301 – 수학 1 (연습)

303 – 수학 1 (참고)

400 – 다이나믹 프로그래밍 1

401 – 다이나믹 프로그래밍 1 (연습)

402 – 다이나믹 프로그래밍 1 (도전)

5. 백준_알고리즘 기초 2/2

– 하루에 적어도 한 문제씩 익숙해질 때까지 계속 풀어줍시다.

포함되어 있는 문제

500 – 브루트 포스

510 – 브루트 포스 (N과 M)

520 – 브루트 포스 – 순열

530 – 브루트 포스 – 재귀

540 – 브루트 포스 – 비트마스크

600 – 그래프 1

601 – 그래프 1 (연습)

602 – 그래프 1 (도전)

610 – BFS

620 – 트리 1

6. 백준_알고리즘 중급 1/3

– 하루에 적어도 한 문제씩 익숙해질 때까지 계속 풀어줍시다.

포함되어 있는 문제

521 – 브루트 포스 – 순열 (연습)

531 – 브루트 포스 – 재귀 (연습)

533 – 브루트 포스 – 재귀 (참고)

541 – 브루트 포스 – 비트마스크 (연습)

611 – BFS (연습)

710 – 그리디 알고리즘

711 – 그리디 알고리즘 (연습)

712 – 그리디 알고리즘 (도전)

800 – 분할 정복

801 – 분할 정복 (연습)

802 – 분할 정복 (도전)

810 – 정렬

820 – 이분 탐색

821 – 이분 탐색 (연습)

7. 백준_알고리즘 중급 2/3

– 하루에 적어도 한 문제씩 익숙해질 때까지 계속 풀어줍시다.

포함되어 있는 문제

550 – 브루트 포스 – 문제

551 – 브루트 포스 – 문제 (연습)

552 – 브루트 포스 – 문제 (도전)

560 – 브루트 포스 – 기타

612 – BFS (연습 2)

900 – 자료구조 2

901 – 자료구조 2 (연습)

910 – 문자열 알고리즘 1

911 – 문자열 알고리즘 1 (연습)

912 – 문자열 알고리즘 1 (도전)

1000 – 다이나믹 프로그래밍 2

1001 – 다이나믹 프로그래밍 2 (연습)

1002 – 다이나믹 프로그래밍 2 (도전)

1100 – 수학 1

1102 – 수학 1 (도전)

1103 – 수학 1 (참고)

1110 – 기하 알고리즘 1

8. 백준_알고리즘 중급 3/3

– 하루에 적어도 한 문제씩 익숙해질 때까지 계속 풀어줍시다.

포함되어 있는 문제

1200 – 그래프 2

1201 – 그래프 2 (연습)

1202 – 그래프 2 (도전)

1210 – 트리 2

1211 – 트리 2 (연습)

1220 – BFS 2

1230 – 세그먼트 트리

1240 – 펜윅 트리

1300 – 다이나믹 프로그래밍 3

1301 – 다이나믹 프로그래밍 3 (연습)

1302 – 다이나믹 프로그래밍 3 (도전)

9. 백준_알고리즘 고급으로 가는 연결 고리 1/2

– 하루에 적어도 한 문제씩 익숙해질 때까지 계속 풀어줍시다.

포함되어 있는 문제

1320 – 다이나믹 프로그래밍 4

1321 – 다이나믹 프로그래밍 4 (연습)

1322 – 다이나믹 프로그래밍 4 (도전)

1310 – 조합 게임 1

1311 – 조합 게임 1 (연습)

1500 – 문자열 알고리즘 2

1501 – 문자열 알고리즘 2 (연습)

1502 – 문자열 알고리즘 2 (도전)

1600 – 세그먼트 트리와 펜윅 트리

1601 – 세그먼트 트리와 펜윅 트리 (연습)

1602 – 세그먼트 트리와 펜윅 트리 (도전)

10. 백준_알고리즘 고급으로 가는 연결 고리 2/2

– 하루에 적어도 한 문제씩 익숙해질 때까지 계속 풀어줍시다.

포함되어 있는 문제

1330 – 다이나믹 프로그래밍 5

1331 – 다이나믹 프로그래밍 5 (연습)

1332 – 다이나믹 프로그래밍 5 (도전)

1610 – 세그먼트 트리와 펜윅 트리 2

1611 – 세그먼트 트리와 펜윅 트리 2 (연습)

1612 – 세그먼트 트리와 펜윅 트리 2 (도전)

1700 – 네트워크 플로우

1701 – 네트워크 플로우 (연습)

1710 – 네트워크 플로우 2

1720 – 최소 비용 최대 유량

1721 – 최소 비용 최대 유량 (연습)

1722 – 최소 비용 최대 유량 (도전)

알고리즘 공부를 어떻게 시작해야할까? (Feat. 백준 500문제 푼 기념으로 적는 PS 회고록)

안녕하세요? 코딩중독입니다.

어제 “백준 6219번 소수의 자격” 문제를 풀었고, 이것이 저의 500번째 푼 문제가 되었습니다.

물론, 아직 세자리수 등수에 들지 못하였고, 다른 분들이 보기에 많은 문제는 아니라고 생각할 수 있으나, 저에게 있어서 500문제는 의미가 꽤 큽니다.

올해 세운 목표가 500문제를 푸는 것이었고, 오늘은 목표를 달성한 기념으로 저의 PS 회고록을 적으려고 합니다.

PS에 빠지게 된 이유

제가 PS에 빠지게된 이유는 간단합니다. 바로, ‘열등감’때문이었죠.

저는 대학교에 들어가서 처음 프로그래밍을 접했습니다. 그리고 1학기는 C, 2학기는 Java와 C++, Python을 배웠습니다.

처음에는 내용이 어렵지 않아서 수업을 곧잘 따라갔지만, 시간이 지날수록 포인터, 객체지향프로그래밍, 제네릭과 컬렉션 등 난이도 높은 내용은 이해하는 데 많이 어려움을 느꼈습니다.

그래서 알고리즘을 공부하기보다는 프로그래밍 언어 과목을 따라가기 급급했습니다. 과제도 다른 사람들에 비해 해결하는 시간이 오래 걸렸고, 지금 생각해 보면 효율적인 코드보다는 어떻게든 결과를 돌아가게만 만든 좋지 못한 코드를 작성했던 것 같습니다.

그러한 상황에 저는 마음이 맞는 친구와 알고리즘 동아리에 들어가면서 브루트포스, 그리디 알고리즘, DP 등 여러 가지 알고리즘 기법을 배웠습니다.

또한, 그 기법으로 백준 문제를 풀기도 하였는데 저는 그 중에서 해결한 문제가 거의 없었습니다.

반면, 제 주변 동아리원들은 대부분 기법을 이해하고 문제를 어느 정도 푸는 것 같았습니다. 저와 같이 동아리에 들어간 친구들도 마찬가지였고, 점점 자신감을 잃어갔습니다.

그렇게 제 자신에게 열등감을 느꼈고, 이것은 오히려 PS에 빠지는 기폭제로 작용하였습니다.

PS를 공부한 방식

PS를 열심히 공부하겠다고 생각하였으나, 정작 무엇부터 시작해야하는지 감이 쉽게 잡히지 않았습니다.

저는 나름대로 커리큘럼을 세우기 위해서 구글링을 해 보았고, 정말 귀중한 블로그를 찾게 됩니다.

plzrun님의 블로그로, 특히 이 게시글에서 도움을 매우 많이 받았습니다.

plzrun님은 백준 강의를 추천해 주셨는데, 저는 8~9만을 낼 거금은 없었기에 포스팅에 나와 있는 커리큘럼을 따라 가기로 하였습니다.

입출력 방식에서 시작해서, 기초 자료구조, 기초 수학, DP, 정렬, 그래프, 이분탐색, 분할정복, 그리디, 완전탐색으로 끝이 납니다.

자세한 문제 커리큘럼은 아래와 같습니다.

입출력 – 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

DP – 1463, 11726, 11727, 9095, 10844, 11057, 2193, 9465, 2156, 11053, 11055, 11722, 11054, 1912, 2579, 1699, 2133, 9461, 2225, 2011, 11052

정렬 – 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, 11653, 10872, 1676, 2004, 6588

그래프 – 1260, 11724, 1707, 10451, 2331, 9466, 2667, 4963, 7576, 2178, 2146, 1991, 11725, 1167, 1967

이분탐색/삼분탐색 – 1654, 2805, 2110, 10815, 10816, 11662

분할정복 – 11728, 1780, 11729, 1992, 2447, 2448, 1517, 2261

그리디 – 11047, 2875, 10610, 1783, 1931, 11399, 2873, 1744

완전탐색 – 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

이 문제를 모두 풀어보는 것이 알고리즘의 기초라고 생각합니다.

그리고 알고리즘 기법을 새로 배우기 위해서는 백준 강의말고 인프런 강의를 참고하였습니다.

권오흠 교수님의 강의인데, 처음에 개념을 익히기 좋습니다. 링크는 이곳이 되겠습니다.

정리하자면, 처음에 개념을 인프런 강의에서 배우고, 구글링을 통하여 개념을 다시 한 번 학습한 다음에 plzrun님의 커리큘럼을 따라가는 방식으로 공부를 시작했습니다.

PS를 공부할 때 주의 사항

plzrun님이 말씀하신 것과도 유사한데, 한 문제에 무조건적으로 몇 시간 이상을 때려 박는 것은 비효율적입니다!!

특히, 어떠한 개념을 처음 배웠을 때는 그것을 바로 응용하는 것은 매우 어려운 일이므로, 초반에는 해답을 보면서 푸는 것이 좋습니다. 그리고 그 방식이 장기적으로 오히려 효율적입니다.

물론, 어느 정도 기법을 익히고 나서 하나의 문제가 될듯 말듯 안 되는 느낌이 있는 것이라면 어느 정도 시간을 사용하여 풀어내는 것이 의미있겠지만, 제 개인적으로 그것도 1시간 ~ 2시간이 넘어간다면 답의 힌트를 얻기를 바랍니다.

그리고 그 힌트를 다른 블로그에서 읽어도 모르겠다면, 조금 더 힌트를 얻는 식으로 단계적으로 해답을 보는 것이 좋습니다. 또한, 그 문제는 풀더라도 반드시 다른 사람의 코드를 참고해야겠죠?

마지막으로, 처음 문제를 보고 아예 접근 방식이 떠오르지 않았을 때가 있습니다.

저는 커리큘럼을 따라갈 때는 그 문제를 우선 패스하였습니다. 뒤에 있는 문제에서 힌트를 얻어서 풀 수도 있기 때문이죠.

하지만, 이 문제를 풀어야 뒤에 문제를 풀 수 있는 경우, 다른 사람의 풀이에서 단계적으로 힌트를 얻습니다. 위에서 언급한 것과 마찬가지죠.

커리큘럼을 따르지 않고, 자유롭게 문제를 풀 때도 동일합니다. 충분히 고민을 하였음에도, 아예 갈피가 잡히지 않을 때는 주저 하지 않고 단계적 힌트 방식을 따르시길 바랍니다.

이후에 어떻게 공부해야 하는가?

사실 위 커리큘럼을 성실히 따라갔다면, 알고리즘의 기초는 잡혀 있다고 해도 무방합니다.

이제부터는 본인이 필요하거나 하고 싶은 길을 따라가면 됩니다.

만약, 알고리즘이 생각보다 재미가 있거나, 좀 더 어렵고 다양한 개념을 익히고 싶다면 ‘종만북’을 구매하여 공부하는 것입니다. 참고로, 종만북은 알고리즘 문제 해결 전략 세트 (프로그래밍 대회에서 배우는,전2권)을 줄여서 말합니다.

여담으로, 알고리즘 문제 해결 전략 세트 (프로그래밍 대회에서 배우는,전2권)에서 종만이라는 글자가 없는데 왜 종만북이라고 부르는지 의문이 생기실 수 있는데, 그것은 이 책의 저자가 구종만이기 때문이죠.

그외에, 본인이 코딩테스트 준비가 시급하다면 바로 코딩테스트 기출 문제를 풀어 보면서 준비하시면 됩니다.

위 커리큘럼으로는 자료 구조나 그래프, 그리디적인 사고가 부족할 수 있으나, 충분히 PS 경험을 쌓았기 때문에 새로운 개념을 배우고 응용하는 것에는 어려움이 없을 겁니다.

정리

많은 사람들이 PS를 어려워하고 기피하려고 합니다. 하지만, 기업에서는 점점 코딩 테스트라는 제도를 도입하기때문에 어느 정도 알고리즘 문제 해결 능력을 갖추어야 하죠.

저 또한, PS가 많이 힘들었고 왜 해야하는지 잘 몰랐습니다. 그래도 포기하지 않고 정말 하루도 빠짐없이 문제를 풀었고, 그 과정에서 새로운 것을 알아가는 즐거움과 오랜 시간 노력한 문제를 해결한 희열감은 이루 말할 수 없을 정도였죠.

그래서 겨울방학 2개월만에 위 커리큘럼을 전부 해결했으며, 올해는 종만북과 더불어 다양한 알고리즘 대회에 참여하였습니다. 또한, 실제 기업의 코딩테스트를 치르면서 구현 능력을 많이 기를 수 있었습니다.

그럼에도, 제가 배워야할 내용은 무궁무진하기때문에 500문제에서 그치지 않고, 앞으로도 계속해서 PS를 이어나갈 것입니다.

아무쪼록, 알고리즘 공부를 처음 시작하시는 분이 제 포스팅을 통해 방향성을 잡기를 희망합니다.

프론트엔드 개발자에게도 알고리즘 공부가 중요할까?

우리는 왜 알고리즘을 공부할까요? 기초 소양을 쌓기 위해서? 좀 더 나은 개발자가 되기 위해서? 아주 틀린 이야기는 아니지만, 좀 더 솔직하게 얘기해 보겠습니다. 아마 대부분은 코딩 테스트를 통과하기 위해 알고리즘을 공부하고 있을 겁니다.

요즘은 취업과 이직은 물론이고, 부트캠프나 대외 활동에서도 지원자를 가려내기 위해서 코딩 테스트를 요구하는 시대입니다. 물론 최근에는 온라인 저지(Online Judge)로 진행하는 코딩 테스트 대신, 실무형 과제를 제출하는 곳도 많이 있는 것 같습니다. 하지만 알고리즘 코딩 테스트는 여전히 많은 기업에서 실재(實在)합니다.

지금으로부터 약 1년 전, 저 역시 복학을 앞둔 상황에서 처음 알고리즘 공부를 시작했습니다. 공부 목적은 당연하게도 코딩 테스트를 준비하기 위해서였습니다. 알고리즘 공부를 본격적으로 해본 건 처음이었기에 처음에는 실력도 부족했고 두려움이 컸습니다. 사실 은연중에 ‘알고리즘 공부가 굳이 필요한가?’라는 생각도 있었기에, 주변 사람들에게 이를 확인받고 싶어 물어보기도 했습니다.

동공 지진

“프론트엔드 개발자에게도 알고리즘 공부가 중요할까요?”

특히 취업을 준비하고 있거나 또는 개발자로 커리어 전환을 시도하는 분이라면 이런 불안감이 더욱 커지는 것 같습니다. 저도 그랬거든요. ‘프론트엔드 개발자라면 일단 서비스부터 잘 만들어야 할 것 같은데, 알고리즘은 또 언제 배우냐?’라며 막막한 마음이 들었던 것이 사실입니다. 실무에서 써먹을 일도 별로 없을뿐더러, 무엇보다 재미가 없습니다. 하지만 코딩 테스트 때문에 울며 겨자 먹기로 하는 수밖에 없었습니다.

저도 이런 고민을 했던 입장으로써, 오늘은 프론트엔드 개발자의 관점에서 알고리즘 공부의 중요성에 대해 솔직하게 이야기해보고자 합니다. 이번 포스트를 통해 프론트엔드와 알고리즘 공부 사이에서 고민하는 독자들에게 도움이 되었으면 좋겠습니다.

TL;DR 사실 알고리즘을 몰라도 프론트엔드 개발에는 큰 지장이 없다고 생각한다. 하지만 단순한 요구사항 구현을 넘어 효율성, 성능, 개발에 소요되는 시간까지 생각하게 된다면 결국에는 알고리즘과 자료구조를 응용하지 않을 수 없다.

그렇기 때문에 알고리즘 공부는 본인이 필요성을 느낄 때 시작하면 된다. 즉 프론트엔드 개발 생태계에 어느 정도 익숙해진 후 알고리즘 공부를 시작해도 늦지 않다.

알고리즘 공부의 목적은 최소한의 알고리즘 지식과 자료구조를 알고 있다는 것을 증명하는 것이다. 너무 과하게 파고들 필요 없이 적당히만 하자.

나의 경험상 노베이스에서는 매일 1~2시간 공부 기준 6개월 정도 하니 유의미한 성과가 나왔다. 중요한 시험이나 면접이 있다면 이를 감안해서 미리 준비하자.

프론트엔드라는 직군에 매몰되어 알고리즘을 비롯한 CS 공부 자체를 소홀히 하지는 말자. 프론트엔드 개발자이기 이전에, 우리는 개발자다.

너 혹시… 뭐 돼?

뭐 되는 건 아니고 그냥 기본만 합니다.

우선 글을 시작하기 전에, 제가 알고리즘과 관련해서 여러분께 조언을 드릴 입장인지는 모르겠다는 생각이 들어서 조심스럽습니다. 제가 백준(프로그래밍 문제를 풀고 온라인으로 채점 받을 수 있는 곳) 외에 다른 플랫폼은 안 써봐서 모르겠는데 대충 골드 1 정도까지 공부했습니다.

골드 1은 노베이스에서 6개월 동안 매일 한두 시간씩 꾸준히 문제를 풀다 보면 어렵지 않게(?) 달성할 수 있는 수준입니다. 이 정도면 골드 4, 5 난이도 문제를 30분 내외로 풀 수 있을 정도이며, 일반적인 기업에서 커트라인으로 제시하는 코딩 테스트는 무난히 통과할 수 있는 것 같습니다. 덕분에 작년에 네이버와 카카오(1차) 코딩 테스트를 통과한 경험이 있습니다.

지금부터는 제 경험을 바탕으로 프론트엔드 개발자가 알고리즘 공부를 바라봐야 할 관점을 일문일답으로 요약하고자 합니다. 아래에서 이야기할 코딩 테스트는, 전형적인 개발자 채용 과정에서 진행되는 알고리즘 유형과 난이도를 기준으로 한다는 것을 말씀드립니다.

개발자에게 알고리즘이 중요한가?

“그렇습니다.”

우선 프론트엔드라는 단어를 떼어놓고 생각해봅시다. 개발자에게 알고리즘은 어떤 의미일까요? 당연히 떼려야 뗄 수 없는 관계입니다. 알고리즘은 곧 문제 상황이 주어졌을 때 제한된 시간과 메모리 내에서 가장 효율적으로 문제를 해결할 수 있는 방법입니다.

문제를 해결하는 방법은 여러 가지가 있을 수 있지만, 모든 방법이 유용한 것은 아닙니다. 문제를 해결할 수는 있지만 정답을 얻어내기까지의 과정이 굉장히 오래 걸린다면, 이를 이용해 현실 세계에서의 문제를 풀기는 어려울 것입니다. 우리에게 주어진 시간과 자원, 그리고 인내심(…)은 유한하기 때문입니다.

따라서 똑같은 문제 상황이라고 해도 최소한의 시간, 최소한의 공간을 사용하는 알고리즘이 더 유용합니다. 또한 목적에 맞는 자료구조를 활용하면 알고리즘의 효율성을 더욱 개선할 수 있습니다. 이 덕분에 컴퓨터 이론은 과학(Science)에서 벗어나 보다 공학적(Engineering)인 가치를 갖게 됩니다.

프론트엔드 개발자에게 알고리즘 공부는 필수적인가?

“항상 그런 것 같지는 않습니다.”

하지만 프론트엔드라는 단어를 붙이면 좀 애매해집니다. 대우(contraposition)로 생각해보면, 질문이 ‘알고리즘을 배우지 않으면 프론트엔드 개발자가 될 수 없는가?’가 됩니다. 제 경험상 이 전제는 ‘항상 옳지는 않다’라는 생각이 들었습니다. 왜냐하면 그 반례를 많이 봤고, 저 역시 그 반례 중 하나였기 때문입니다.

HTML과 CSS는 외울 게 많긴 하지만, 사용 방법만 알면 되지 내부 알고리즘까지 우리가 알 필요는 없습니다. ‘자바스크립트(JavaScript)’에서 일부 로직에 알고리즘을 적용해 최적화할 수 있지만, 정렬이나 탐색 등 웬만한 기본적인 알고리즘은 이미 API가 제공됩니다. 없다면 라이브러리나 프레임워크를 쓰면 되죠. 생각보다 Node.js 생태계는 무척 잘 되어 있습니다. 즉 우리는 알고리즘 구현 자체를 알기보다는 제공되는 기능을 적재적소에 잘 써먹기만 하면 대부분의 문제를 해결할 수 있습니다.

저도 3년간 알고리즘 기초에 대한 빠삭한 이해 없이 업무를 진행했지만, 업무 중 알고리즘을 몰라서 개발에 문제가 생긴 경우는 거의 없었습니다. 오히려 성능보다는 가독성을 중요시하는 코드를 더 많이 짰습니다. 물론 재귀 함수로 트리 구조의 레이아웃을 구현하거나 계산 결과를 ‘메모이제이션(동일한 계산을 반복해야 할 경우 한 번 계산한 결과를 메모리에 정해 두었다가 꺼내서 중복 계산을 방지하는 것)’하는 것처럼 비즈니스 로직 단계에서 최적화를 진행하면 좋은 경우도 있긴 합니다.

주변에 있는 여러 개발자분의 의견도 비슷합니다. 대부분 프론트엔드 개발자도 ‘알아두면 좋긴 한데, 다른 직군에 비해 알고리즘이 크게 중요한 것은 아니다’라는 이야기를 해주셨습니다. 애초에 직군과 상관없이 실무에서 알고리즘을 쓸 일이 별로 없다는 생각도 많이 들었고요.

왜 일반적으로 프론트엔드에서 알고리즘이 중요하지 않다고 생각할까?

“크게 네 가지 이유가 있는 것 같습니다.”

알고리즘 최적화가 필요한 문제 상황 자체가 별로 없음

서버-클라이언트 구조이기 때문에 대부분의 복잡한 로직이 서버에 탑재됨

브라우저에서 대용량의 데이터를 처리하는 경우가 잘 없음

알고리즘을 추상화한 API를 쓰는 것이 효율적임

그렇다면 왜 일반적으로 프론트엔드에서 알고리즘이 중요하지 않다고 생각할까요? 제가 생각했을 때 네 가지 이유가 있는 것 같습니다.

우선 알고리즘 최적화가 필요한 문제 상황 자체가 별로 없기 때문입니다. 프론트엔드의 주요 역할은 HTML과 CSS를 이용한 퍼블리싱, 데이터 기반의 상호작용 가능한 UI 구현, 그리고 백엔드와의 HTTP 통신 정도가 생각이 나는데요. 이 작업들은 알고리즘에 대한 깊은 지식 없이도 구현이 가능합니다. 즉, 프론트엔드 자체에서 매우 복잡한 로직을 수행하는 것이 아니라면 알고리즘까지 이용해가면서 문제를 최적화해야 할 상황 자체가 자주 발생하지 않습니다. 오히려 유지보수를 위해 최적화를 포기하고 코드의 가독성이나 재사용성을 높이는 경우가 더 많습니다.

만약 복잡한 로직이 필요하다고 해도 웹은 서버-클라이언트 구조를 따르므로 대부분의 복잡한 비즈니스 로직은 서버에 탑재됩니다. 서버(백엔드)는 다량의 데이터를 안전하게 보관하고 내부 동작 방식을 숨길 뿐만 아니라 여러 요청을 동시에 처리하는 데 최적화되어 있습니다. 따라서 클라이언트(브라우저)는 서버에게 필요한 기능을 요청하고 그 결과를 받기만 하는 구조가 바람직합니다.

위의 이유로 브라우저에서는 대용량의 데이터를 처리하는 경우가 잘 없습니다. 애초에 브라우저 자체가 대용량 데이터의 처리를 위해 만들어진 것이 아닙니다. 브라우저의 역할은 사용자를 대신해 백엔드와 상호작용할 수 있는 프론트엔드 인터페이스를 실행시켜주는 것입니다. 알고리즘의 효율성은 데이터 규모(NN)가 커질수록 극적인 효과를 내는데, 브라우저의 성능이 제한적이기 때문에 알고리즘을 이용해 최적화할 수 있는 기댓값이 상대적으로 크지 않습니다.

만약 알고리즘적인 접근이 필요한 경우가 있다고 해도 브라우저나 라이브러리, 프레임워크 등에서 이를 추상화한 API를 이미 제공하며, 이것을 쓰는 것이 효율적이기 때문입니다. ‘추상화되었다’는 말은 우리가 내부 구조를 모르고도 사용할 수 있는 것을 의미합니다. 우리는 getElementById 함수가 DOM 트리 구조를 DFS로 탐색한다는 것을 알지 못해도 됩니다. 해당 API가 입력으로 ID 속성을 받고, 출력으로 DOM 엘리먼트가 반환된다는 사실 자체만 이해하고 쓰는 게 더 경제적입니다.

요약하자면, 우리가 프론트엔드에서 일상적으로 풀어야 할 문제들은 이미 추상화된 형태로 제공되는 알고리즘들의 조합으로 해결 가능하며 이것이 효율적이기 때문입니다. 따라서 추상화된 형태로 제공되는 알고리즘의 입출력만 잘 알면 실무에 있어서는 큰 지장이 없기 때문에 이런 일이 가능한 것 같습니다.

알고리즘을 실무에 써먹을 데가 없으면 굳이 배워야 할까?

“단순히 주어진 요구사항 구현뿐만 아니라 성능과 효율성까지 챙기는 개발자가 되기 위해서는 배워야 합니다.”

오늘의 핵심을 꿰뚫는 질문입니다. 개인적인 생각으로는 알고리즘을 몰라도 프론트엔드 개발이 가능하긴 하지만, 더 넓은 시야를 가진 개발자로 성장하기 위해서는 알고리즘 공부가 필요하다고 생각합니다. 생각의 규모를 조금 더 확장해 생각해본다면, 우리가 왜 CS를 공부해야 하는지에 대한 답과도 일맥상통합니다.

그렇게 생각하는 첫 번째 이유는 알고리즘과 자료구조의 조합을 이해하고 있으면 우리가 실제로 해결하고자 하는 문제 상황에 최적화된 구조를 쉽게 떠올리고 설계할 수 있기 때문입니다. 흔히 이야기하는 ‘컴퓨팅적 사고(Computational Thinking)’가 바로 이것입니다.

만약 여러분이 크기가 매우 큰 배열에서 특정 값을 찾아야 할 때 Array.find() 를 사용할 수도 있지만, 그 값이 정렬되어 있다면 이분 탐색으로 값을 찾는 것이 훨씬 더 빠릅니다.

를 사용할 수도 있지만, 그 값이 정렬되어 있다면 이분 탐색으로 값을 찾는 것이 훨씬 더 빠릅니다. 만약 여러분이 SNS 웹 애플리케이션을 기획한다고 할 때, 각 인물 사이의 관계를 추상화하기 위해서 그래프 이론과 그래프 탐색 알고리즘을 사용할 수 있습니다.

만약 여러분이 파일 탐색기 같은 중첩 가능한 UI 구조를 만들어야 할 때는 트리 자료구조와 분할 정복 기법을 이용해 컴포넌트를 설계할 수 있습니다.

한 번 서버에서 불러온 데이터를 메모이제이션하는 방식으로 동적 프로그래밍 기법을 적용할 수 있습니다.

이를 잘 이용한다면 소프트웨어 개발 시간을 줄이면서 성능과 효율성을 높일 수 있고, 수준이 매우 뛰어나다면 비즈니스적 성과로도 이어질 수 있습니다.

두 번째 이유는 환경이나 플랫폼의 변화에도 흔들리지 않는 개발자가 될 수 있기 때문입니다. 우리는 알고리즘이 추상화된 형태의 API 또는 라이브러리를 많이 쓰곤 합니다. 하지만 그것만 가지고 “알고리즘을 이해했다”라고 이야기할 수 있을까요? 정확하게 이야기하자면 우리는 다른 개발자들이 만들어 놓은 기반 위에서 동작하는 API를 그저 사용한 것뿐입니다.

이러한 개발자들은 특정 환경과 특정 플랫폼에 단단히 종속될 수 있다는 점에서 위험합니다. 원리를 이해한 것이 아니라 기능을 사용했기 때문입니다. 따라서 환경이 바뀌거나 본인이 익숙하지 않은 플랫폼에서는 적응에 상당한 어려움을 겪을 것입니다.

만약 여러분이 JavaScript Web API에서 기본으로 제공되는 getElementById 를 파이선(Python)에서 구현해야 하는 일을 맡게 됐다면? Python에서 기본 제공되는 자료구조인 힙, 우선순위 큐 등의 자료구조를 JavaScript에서 구현해야 하는 일을 맡게 된다면? 게다가 만약 내가 필요한 기능의 라이브러리를 사용할 수 없는 환경이라면?

언어 자체가 익숙하지 않다면 문법이 헷갈릴 수 있겠지만 이건 큰 문제가 아닙니다. 문법이야 배우면 되니까요. 알고리즘과 자료구조에 대한 이해만 있다면, 환경과 플랫폼에 상관없이 효율적인 문제 해결 방법을 제시할 수 있다는 사실이 더 가치 있는 것입니다.

마지막 이유는 모든 응용 기술들은 결국 기초 기술을 기반으로 만들어지기 때문입니다. 결국 하고 싶은 이야기는 ‘어느 정도 기초에 충실하자’라는 겁니다. 모든 개발자는 본인이 사용하고 있는 기술 그 자체에서 이해를 멈추는 것이 아니라, 그것을 떠받치고 있는 기술을 이해하기 위해 노력해야 할 필요가 있습니다. 그래야만 본인의 기술을 더 잘 활용할 수 있습니다.

비즈니스 로직이 어떻게 알고리즘과 자료구조로 추상화되며, 그렇게 작성한 React와 TypeScript 코드가 어떻게 JavaScript로 어떻게 컴파일되고, 이 JavaScript는 HTML, CSS와 함께 어떻게 브라우저에서 동작하는지, 그 브라우저는 어떻게 운영체제에서 관리되며, 운영체제는 어떻게 다양한 호스트에서의 네트워크 연결을 중재하는지도 생각해봐야 합니다.

이런 과정들이 불필요해 보이나요? 우리가 쉽게 사용하는 기술들은 공짜로 얻어진 것이 아닙니다. 기반이 되는 모든 기술을 이해하자는 것이 아닌, 최소한의 지식 정도는 알고 있자는 것입니다.

그렇다면 기업은 왜 알고리즘으로 코딩 테스트를 보는가?

“기업 입장에서 수많은 지원자의 기본기를 검증할 수 있는 가장 경제적인 방법이기 때문입니다.”

위에서 뭔가 거창하게 이야기했지만, 사실 기업 입장에서 저렇게 사명감(?) 넘치는 취지로 알고리즘 코딩 테스트를 보는 것은 아니라고 생각합니다. 그 이유는 알고리즘 코딩 테스트가 기업 입장에서 매우 경제적인 평가 방법이기 때문입니다.

물론 기본기를 평가하는 목적도 있지만, 알고리즘 테스트를 도입하면 지원자들의 점수를 객관적으로 수치화할 수 있습니다. 덕분에 점수에 따라 지원자들을 일렬로 줄 세울 수도 있고, 무의미한 실력의 지원자를 쉽게 걸러낼 수도 있습니다. 또한 빠르면 한두 시간 내에 평가가 끝나기 때문에 내부 구성원들의 리뷰가 필요한 과제 전형에 비해 리소스를 덜 쓰기도 합니다. 특히 어느 정도 규모가 있는 회사일수록 지원자는 많은 반면 인원은 신중하게 뽑기 때문에, 면접 전까지는 점수로 커트하려는 목적도 있습니다.

알고리즘은 테스트 케이스 통과 여부에 따라 정답과 오답이 명확하게 드러나고, 효율성을 수치화하기에도 적합하기에 코딩 테스트의 평가 기준으로 사용되고 있는 듯합니다. 사실 기업 입장에서도 모든 지원자의 편의를 봐주고 코드를 읽어볼 수는 없는 노릇이니, 이해는 갑니다.

하지만 실무용 코드와 알고리즘 문제 해결을 위한 코드는 다르지 않은가?

“맞습니다만, 문제 접근 방식을 평가하기 위한 목적도 있습니다.”

목적 자체가 다르긴 합니다. 단순히 일회성으로 정답을 찾기 위한 코드, 그리고 유지보수성과 재사용성을 고려하면서 작성한 코드는 분명 다릅니다.

그래서일까요? 최근에는 일부 기업에서 코딩 테스트 대신 과제나 포트폴리오를 더 많이 보는 전형도 생기고 있다고 합니다. 하지만 채용 과정을 진행하는 것은 전적으로 기업의 선택이기 때문에, 어떤 것이 정답이라고 이야기할 수는 없습니다. 구글에서는 아직 알고리즘으로 코딩 테스트를 본다고 합니다. 기업의 입장에서 변호하자면, 알고리즘 코딩 테스트를 통해 효율성뿐만 아니라 문제 접근 방식에 대한 평가도 진행할 수 있습니다.

면접에서 코딩 테스트 때 제출한 코드를 리뷰하는 경우도 꽤 있습니다. 또한 라이브 코딩 테스트 같은 경우에는 면접관이 일부러 요구사항이 모호한 문제를 주기도 합니다. 따라서 지원자는 요구사항을 명확히 하기 위한 질문을 면접관에게 해야 하고, 이렇게 커뮤니케이션하는 과정에서 문제 접근 방식을 평가할 수 있습니다.

만약 여러분이 가고 싶은 회사에서 알고리즘으로 코딩 테스트를 본다면? 뭐, 조금 냉정하게 들리겠지만, 포기하거나 공부해서 시도하거나 둘 중 하나밖에 없습니다. 사실 이게 불합리하다고 느껴진다면 과제로 검증하는 회사를 지원해야 합니다.

그렇다면 알고리즘 공부는 언제 시작하면 좋은가?

“본인이 필요하다고 느껴질 때 하면 됩니다.”

저처럼 각종 교육 과정이나 채용 전형으로 요구되기 때문에 미리 준비해둘 수도 있고, 그냥 본인이 더 나은 개발자가 되고 싶어서 공부할 수도 있습니다. 자투리 시간을 생산적으로 활용하고 싶을 때도 틈틈이 공부하기 좋습니다. (뭐 군대에 있을 때라던가…)

개인적으로는 완전 노베이스 기준 매일 1~2시간 공부 기준 6개월 정도 했을 때 웬만한 알고리즘 코딩 테스트는 통과했던 것 같습니다. 중요한 시험이나 면접이 있다면 이를 감안해서 미리 준비할 필요가 있을 겁니다.

어디까지 공부하면 되는가?

“목표에 따라 다른 것 같지만 취업을 위해서라면 기본기만 챙기면 충분합니다.”

저는 아래 범위를 위주로 공부했습니다.

수학, 조합론, 기하학

브루트포스, 그리디

분할 정복, 재귀

투포인터

자료구조(스택, 큐, 우선순위 큐, 힙, 해시, 트리, 유니온 파인드…)

이분 탐색

다이나믹 프로그래밍

그래프 이론, 그래프 탐색(BFS, DFS, 백트래킹, 다익스트라, 플로이드-워셜…)

비트마스킹

시뮬레이션, 구현

개인적으로 알고리즘은 설계를 쉽고 효율적으로 만들어주는 개발자의 기초 체력이라고 생각합니다. 물론 많이 알수록 좋지만 올림피아드에 나가지 않는 이상 알고리즘 그 자체에만 매달리는 것은 그리 효율적이지는 않다고 생각합니다. 기본이라는 기준이 대부분의 기업 코딩 테스트에서 요구하는 수준인 것 같고, 그 이후로는 본인이 전문성을 가져야 하는 직군의 공부를 더 하는 게 좋다고 생각합니다.

그렇기 때문에 만약 프론트엔드 개발자가 되고 싶긴 한데 프론트엔드 자체에 대한 지식이 부족하다면, 이 경우에는 알고리즘보다는 프론트엔드부터 공부하는 걸 추천합니다. 즉 프론트엔드 개발 생태계에 어느 정도 익숙해진 상태에서 알고리즘 공부를 병행하는 방식이 괜찮을 것 같습니다.

마무리

적다 보니 내용이 많이 길어졌습니다. 건조하게 ‘알고리즘 공부는 당연히 중요하다’라고 하기보다는 좀 더 실무적인 입장에서, 그리고 프론트엔드 개발자의 관점에서 글을 한 번 주절주절 써봤습니다. 사람에 따라 의견이 다를 수도 있는데, 건전한 피드백과 토론은 언제든 환영이니 댓글 남겨주시기를 바랍니다.

그리고 글을 마무리하기 전에 덧붙여봅니다. 프론트엔드라는 직군에 매몰되어 알고리즘을 비롯한 CS 공부 자체를 소홀히 하지는 맙시다. 프론트엔드 개발자이기 전에, 우리는 개발자니까요.

알고리즘 공부 사이트 정리

728×90

반응형

728×90

알고리즘 초보 추천 공부 방법!

1. 코드업 기초 100제

2. 백준 온라인 저지 – 그리디, 완전탐색, BFS, DFS, 기본 동적 프로그래밍 각 50문제 풀기

(심화 : 그래프 이론, 중/고급 동적 프로그래밍, 문자열 공부)

3. 프로그래머스 등에서 원하는 기업의 기출문제 풀기

알고리즘을 공부할 수 있는 사이트를 정리해보았다.

1. 코드업 : 초급자 코스인 [기초 100제]로 기본기 쌓기

– C언어 기초 100제 : ‘C’언어, ‘자바’로 채점 가능

-> 문제 번호 1001번부터 시작

-> C언어 풀이는 있는데 자바 해설은 따로 없어서 ‘코드업 1001번 자바’ 이렇게 검색해서 블로그 글 참고!

– Python 기초 100제 : 파이썬

www.codeup.kr/index.php

2. SW Expert Academy

– 알고리즘 문제를 풀어볼 수도 있고, Visual Code에서는 자료구조 및 알고리즘에 대한 시각화 학습 자료를 볼 수 있다.

Visual Code

swexpertacademy.com/main/learn/course/subjectList.do?courseId=AVuPCwCKAAPw5UW6

3. BOJ – BaekJoon Oline Judge

– 그리디, 탐색유형, 기본 동적 프로그래밍 문제를 각 50개씩 풀어보기를 추천!

www.acmicpc.net/

– 백준 온라인 저지 태그, 난이도 정보 제공 사이트 (solved.ac/)

4. 프로그래머스

– 마찬가지로 코딩테스트 연습을 해볼 수 있고 실제로 기업에서 코딩테스트를 할 때 프로그래머스를 통해서 테스트를 하는 경우가 많다. 관심있는 기업의 기출문제가 있는지 확인해보고 풀어보면 좋은 곳!

– 레벨 별로 난이도 별로 필터해서 볼 수 있으니 자기에게 맞는 난이도의 문제를 풀어볼 수 있다.

programmers.co.kr/

5. leetcode : 여기는 영어로 된 사이트

leetcode.com/

6. visualgo.net

– 영상을 통한 자료구조와 알고리즘의 시각화(한국어판) 사이트

visualgo.net/ko

7. 코드포스

codeforces.com/

8. 해커랭크

www.hackerrank.com/

728×90

반응형

자료구조, 알고리즘 공부를 시작하려 한다면…

이 글은 2021년 8월부터 12월까지 진행된 코딩테스트 대비 알고리즘 튜터링 알튜비튜의 회고글입니다.

코딩테스트 때문에 알고리즘 공부는 해야겠는데 막막한 분들을 위한 글…

근데 ‘일주일이면 너도 합격할 수 있다!’이런 글은 아닙니다. 최소 3개월은 투자해야 해유

아직 과제 마감이 끝나진 않았지만, 사실상 끝나기도 했고 또 언제 이 글을 쓸 시간이 생길지 몰라 지금 쓴다.

알튜비튜 깃허브 링크

왜 시작했는가?

TMI니까 짧게 요약하면…

학교에서 (적진 않은) 돈을 받고 하는 튜터링 프로그램이 있었다. 정해진 시간에 줌 회의실 열어두면 학생들이 들어와 프로그래밍 언어나…개발 관련한 질문을 하는 그런 프로그램이었는데…3개월동안 1명 왔나? 암튼 그랬다.

물론 그거 말고도 해야 하는 업무가 몇 개 있었지만 아무튼 받는 돈에 비해서 할 일은 아주 적은 소위말해 개꿀인 프로그램이었다.

이 이야기는 그 개꿀 프로그램을 최저시급도 못 받는 강행군으로 스스로 몰아넣은 이야기다.

1학기에 이어 2학기에도 프로그램을 하게 됐다. 이번에도 업무는 비슷했고, 학생들은 오지 않을게 분명했다.

어차피 졸업하는 입장에서 한 번 더 잉여롭게 시간을 죽이며 돈을 받아갈 수 있었지만…이런저런 사건들과 이상한…사명감에 휩싸여 이상한 프로젝트를 기획하게 된 것이다.

아이디어 회의 노션 페이지

솔직히 나 혼자 기획했다면 저어어어얼대로 못했을 것이다. 하지만 나에겐 킹왕짱 진짜 멋있는 동료들이 있었다.

아무튼…교수님께 우리끼리 정리한 내용을 공유드렸고, 오케이를 받았다.

자료구조, 알고리즘에 대한 이론 공부는 2-2, 3-1에 들었던 수업으로 했다지만 제대로 문제를 풀어보며 공부를 한건 사실상 올해 3월부터였는데, 당시에 무슨 정신으로 알고리즘 특강을 열겠다고 한건지 모르겠다.

홍보를 하고 모집을 받고, 우린 태평하게 ‘ㅎㅎ 15명정도 오실까요? 미달이면 홍보를 더해야겠어요’ 이런 말을 했ㄷ..ㅏ…

이후 이야기는 기니까 각설하면 처음에 20명정도의 수강생을 생각했는데 정신차려보니 약 55명으로 시작했다는 이야기다.

물론 지금 끝까지 함께하신 분들은 25분..? 정도 계시는데 예측했던 수치보다 많은 숫자긴하다. 다들 대단하시다.

지금보니 말이 안되는 스케줄과 커리큘럼 근데 했다.

알고리즘을 공부하신 분들이라면, 그리고 이게 정규 학기와 병행하는 프로젝트란걸 아신다면…

이게 말도 안되는 스케줄이란걸 아시겠지만, 우린 다 열정이 넘쳐서 브레이크를 잡아줄 사람이 없었다.

구성

우리보다 자료구조, 알고리즘을 잘 가르치시는 분들은 많다. 뭐 당장 우리학교 교수님들, 유투브 선생님들, 책, 강의…

아무리 열심히 공부를 했다지만 학부생이 가르칠 수 있는 깊이에는 한계가 있을게 분명했다. 그래서 코드 리뷰를 추가했다.

1. 매주 특정 알고리즘을 주제로 강의식 튜터링 진행

2. PS 과제

3. 제출된 과제에 대한 코드리뷰

3번이 핵심인 셈인데, 인력난과 우리의 경험치 부족으로 이 부분을 제대로 신경쓰지 못한 것 같아 아쉽다.

그리고 우리 스케줄이 빡빡하다보니 뒤로 갈수록 제출되는 과제도 적어졌고… 아무래도 우리 과제보단 교수님들의 과제가 더 중요하니까

커리큘럼은 이렇게 짰다.

https://www.acmicpc.net/step

이건 백준의 단계별로 풀어보기인데, 나도 처음 알고리즘 공부를 시작할 때 이 목록의 문제들을 순서대로 풀기도 했고, 진짜 좋다.

다만 자료구조 파트를 다 하고(그래프 빼고), 알고리즘을 배우는게 좋을 것 같아 약간 순서를 바꾸긴 했다.

물론 많은 언어가 자료구조와 간단한 알고리즘을 라이브러리로 제공하지만, 라이브러리를 보기 전 직접 구현해보도록 했다.

내가 쓰는게 어떤건지 알아야 응용도 할 수 있고, 뭐 그렇게 생각했다.

과제 문제를 고를 때는 역시나 저 단계별로 풀어보기에 있는 문제들을 몇개 참고했다.

하지만, 풀이가 거의 비슷한 문제들도 꽤 있었고 우리가 매주 나가는 과제 문제가 (겨우) 6개였기 때문에 모든 과제 문제의 풀이가 달랐으면 했다. 일주일에 6(+2)문제가 나가는데 겨우??라고 생각할 수도 있지만, 그 주제를 대표하는 6 문제를 고르는건 참 어려웠다.

https://github.com/tony9402/baekjoon

그래서 추가로 이 레포지토리를 참고했다.

진짜 좋은 레포지토리라고 생각한다. 특히 푼 사람이 많지 않은 문제라면 이 문제가 정말 괜찮은걸까?라고 생각하며 꺼리게 될 수도 있는데, 이 레포는 그런 숨어있는 좋은 문제들을 많이 소개하고 있다.

당연한거지만 이렇게 과제후보로 정한 문제들은 다 풀었다. 그래도 10개 골라오면 1개 살아남는 그런 잔인한 방식은 아니었고

내 선에서 잘린게 대충 1/5 정도고, 제안했는데 잘린건 그보다 적으니까 10문제 풀어오면 7~8문제 정도는 살아남은 셈이다.

준비

스택, 큐, 덱

최단경로

그냥 만들었던 강의자료 아무거나 들고왔다.

‘스택, 큐, 덱’은 라이브러리가 있는 자료구조지만 앞서 말했듯이 다 직접 구현해보는걸 지향하여 ppt에도 관련한 내용을 넣었고

‘최단경로’는 워낙 어려운 주제기도 했는데 이런 저런 예시들을 가져오며 알고리즘 수행 결과를 단계별로 보여주도록 했다.

튜터링 시간에는 라이브 코딩도 했는데, 해당 알고리즘의 아주 기본만 담은 기본 문제와 이를 응용한 응용 문제로 나누어 풀었다.

함께 실시간으로 코딩을 하면 코드를 짜는 과정이나, 갑작스러운 상황에서 어떻게 대처해야하는지 볼 수 있지 않을까 싶어 넣었다.

라이브 코딩 자료 역시 미리 다 준비는 해두기 때문에 큰 사고가 있었던 적은 없고, 거의 간단한 실수가 대부분이었다.

과제는 항상…응용 문제와 비슷한 난이도라고 생각하고 냈는데 체감은 그렇지 않았나보다.

대놓고 어려운 문제를 1문제 정도 섞긴 했었다.

당연히 우리가 준비하는 코드들도 다 코드리뷰를 거쳤다. 그랬는데도 가끔 발견하지 못한 것들이 있긴 했다.

아니 회고가 너무 길어지네 그냥 빨리 적으면

주제 알고리즘 6문제에 추가로 구현 문제도 매주 2개씩 나갔다.

요즘 점점 많은 회사들이 구현 문제를 내는 것 같아서 넣기도 했고, 대다수의 회사가 코너 케이스를 제공하지 않다보니 반례를 만드는 연습을 할겸 넣기도 했다.

코드리뷰 기준은 크게 3개였다.

1. 문제가 맞았는가? 풀이가 이상한데 답은 맞았습니다를 받은 경우는 없나? (이런 경우가 없지 않나 생각할 수 있지만 있다.)

2. 시간복잡도면에서 비효율적인 부분은 없나? (O(n)이 가능한 풀이인데 O(n^2)이라던가…TLE로 잡히지 않는 비효율적인 부분들)

3. 가독성은 괜찮나? (코드를 함수로 분리하거나, 인덴테이션이 너무 깊게 들어가지 않도록)

그걸 어떻게 알아채냐고 물어본다면…사실 잘 모르겠다.

그냥 내가 그 문제를 푼적 있으니까 내가 했던 실수나 비효율적인 부분이 그대로 나타나는 코드도 있었다. 그리고 내가 단순히 모범답안 코드를 봤다면 코드리뷰가 어려웠겠지만 문제를 직접 풀면서 더 좋은 코드를 짜기 위해 고민했었기 때문에 할만했다.

한편으론 내 시야 이상의 무언가를 발견할 수 없었다는 의미기도 하다. 이 부분은…개선할 방법을 대충 구상하긴 했다.

회고는 여기서 끝났고, 이제 제목과 관련한 이야기를 해보도록 하자

혼자 공부한다면

일단 자료구조에 대한 이론 지식은 있는게 좋지 않을까 싶다. 실제 코딩테스트에선 이 문제가 어떤 알고리즘으로 풀리는 문제인지 알 수 없다. 라이브러리만 달달 외운다면 특정 상황에서 어떤 자료구조와 알고리즘을 사용해야할지 판단하기 어려울 수 있다.

(예를 들어 TLE를 막고자 스택, 큐 같은걸 사용한다거나…)

이론이 그렇게 어려운 것 같진 않아서 금방 배울 수 있다. 저 위에서 말한 유투브 선생님께 가도 괜찮고, 전공자라면 교수님 강의 자료를 보거나 뭐…우리 자료를 봐도 괜찮다. 교수님 강의 자료로 배운 사람들이 많든 자료니까 허허

공부하는 순서는 역시나 앞서 말한 백준의 단계별 풀이 문제를 순서대로 푸는걸 추천한다.

알고리즘을 처음 공부한다면 이게 어떤 알고리즘의 문제인지 파악하는 것부터가 어렵다. 그리고 비슷한 스타일의 문제가 뭉쳐있기도 해서 처음엔 어렵지만 비슷한 문제를 연속해서 풀어보며 이해하기도 좋다. 프로그래머스도 좋긴 하지만 문제의 수가 백준에 비해선 많이 적고, 난이도 책정이 너무 포괄적이다.

단계별 풀이 문제를 다 풀었다면

https://www.acmicpc.net/workbook/top

여기가서 그냥 맘에드는거 풀면 좋다. 맨 위에 삼성 기출문제가 있는데 구현능력 키우기엔 삼성 문제가 좋다. (어렵다)

https://www.acmicpc.net/workbook/codeplus

그 옆에 코드플러스 들어가서 풀어도 좋다. 근데 난이도가 급발진 하는 문제도 있으니 그냥 풀고 싶은걸 풀어라

다만 아쉬운게 있다면 알고리즘 유형이 문제집 이름에서 드러난다는 점인데

전체 문제가서 적당히 원하는대로 필터링해서 풀면 된다.

이건 내가 쓰는 필터링인데 제출한 적 없는 문제 중에서 실버~골드 문제를 맞은 사람이 많은 순서로 정렬했다.

정렬은 그냥 많은 사람이 풀었으면 괜찮은 문제겠거니~ 하고 저렇게 정렬했다. 필터링 옵션이 많으니 입맛대로 골라쓰세유

이걸 단계별로 진행해야하는건 아니고 그냥 이거했다가 저거했다가 하는게 좋다.

왜냐하면 단계별 풀이 목록에도 정말 다양한 난이도의 문제가 있고, 괜히 안풀리는거 붙잡다가 흥미를 잃을 수도 있다.

그리고 문제 풀면 꼭 다른 사람 코드를 4~5개는 찾아봤으면 좋겠다. 내가 몰랐던 라이브러리를 알 수도 있고, 리팩토링을 하는데 도움이 될 수도 있다. 문제가 풀렸다고 그대로 커밋하지말고 완성된 코드를 짧게 쳐다보며 리팩토링을 해도 좋다. 맞았습니다를 받기 위해 넣어뒀던 이상한 코드들을 발견할 수도 있고, 내가 이걸 어떻게 풀었는지 정리할 수 있다.

스터디라면

알고리즘 스터디를 해본적이 없어 잘 모르겠지만…

사람이 모인 김에 상호 코드 리뷰는 꼭 넣었으면 좋겠다. 그냥 각자 공부하고 점검하면 뭐 혼자 공부하는거랑 똑같으니까

다만 단점이 있다면 코드리뷰를 하려면 내가 그 문제에 대해 알고 있어야 하고 그럼 스터디원들이 푸는 문제가 획일된다. 어떤 문제를 풀지 정하는 데에도 시간이 걸릴테고…

저 위에서 내가 추천한 문제 목록 레포도 있고, 검색하면 추천 문제 목록이 굉장히 많다. 잘 찾아봐서 잘 결정하시면 된다.

그리고 패널티는 알아서 잘 정하시겠지만, 코드 카피도…신경써야 한다.

구글에 백준 OOOO번 이렇게만 검색해도 풀이 코드가 저어엉말 많다. 만약 패널티가 빡세다면 패널티를 피하기 위해 그냥 적당히 코드 복붙해서 제출할 수도 있다.

사실 가장 맘편한건 신경쓰지 않는 것이다. 카피를 해봤자 본인 손해니까…

근데 난 스터디 프로그램을 이끄는 튜터라 이걸 신경쓸 수 밖에 없었다.

취지에도 맞지 않고, 안좋은 습관이 생길 수도 있고, 가장 큰 이유는 구글링해서 나오는 코드가 완벽한게 아니다.

당장 내가 공부하면서 올린 코드들도 지금보면 눈뜨고 볼 수 없고, 아예 방향이 잘못된 코드들도 있다.

뭐…결론은 소규모 스터디에서 카피 잡는건 정말 어려운 일이고 그냥 맘편하고 싶으면 개인의 양심에 맡기도록 하자

마무리

이 모든 글은 개인의 경험에 기반한 것이라 별 도움이 안될 수도 있다. 어차피 개인적인 회고글에 가깝기도 하다.

하지만 알고리즘이 너무 좋아서 대회도 나가고 그럴게 아니라면, 그니까 그냥 코테 통과를 위해 알고리즘 공부를 한다면 알고리즘에 반년 이상의 시간을 쏟지 않았으면 좋겠다. 전공자라 이론 베이스가 있다면 1~3달만 써도 될 것이다.

저는 알고리즘이 너무 좋아서 이 글쓰고 또 문제하나 풀러갈 예정이구요…

저희 깃허브도 정말 튜터들끼리 정성을 다해 꾸린 깃허브니까 참고하셔도 좋습니다

그리고 알튜비튜는 그냥 알투비트가 생각나서 지은 이름이다.

초심자의 알고리즘 공부 순서 (코딩테스트 합격하기!)

컴퓨터 프로그래밍

이 과목에서는 Java와 C++ 언어를 이용한 객체지향 프로그래밍을 학습한다. 학생들은 Java와 C++의 기초 및 API에 대하여 배우고, Java와 C++를 이용하여 실제 문제를 제대로 풀 수 있도록 바르게 동작하고 질 좋은 객체지향 소프트웨어를 작성하는 방법에 대하여 배운다.

이산수학

이 과목에서는 컴퓨터공학과 밀접하게 관련된 수학적 내용들에 대하여 배운다. 논리, 집합, 함수, 관계, 가산성, 조합론, 증명기법, 수학적 귀납법, 재귀함수, 재귀관계, 그래프론, 정수론 등에 대하여 다룬다. 또한, 이러한 수학적 개념들이 컴퓨터공학에서 어떻게 쓰이는지에 대해서 살펴본다.

자료구조

이 과목에서는 컴퓨터에 의한 문제해결을 위해 필요한 개념이나 대상물의 표현을 위한 자료 구조와 문제해결을 위한 체계적 사고 방법을 학습한다. 큐, 스택, 검색 트리, 해시 테이블 등의 자료구조와 그래프를 이용한 문제해결 방법 등을 중심으로 강의를 진행한다.

알고리즘

다양한 알고리즘 개발 방법과 알고리즘 분석 기법을 배운다. 귀납적, 재귀적 사고방식을 배우고 이를 통해 문제를 접근하고 해결해나가는 방법을 배운다.

코딩테스트 준비(알고리즘 공부) 커리큘럼

자료구조 = 식재료 , 알고리즘 = 요리

식재료가 있어야 요리를 한다.

자료구조부터 공부하고 알고리즘 공부하자!

1. 자료구조 공부 순서

A. Array

B. List

a. ArrayList

b. vector

c. LinkedList (simple / doubly / double-ended / circular)

d. Stack (array / list)

e. Queue (array / list / priority / deque / circular)

C. HashMap

D. Tree (simple / binary-search / segment)

E. Heap (max / min)

F. Graph (array / list)

G. HashSet

※ 볼드체로 표시한 것은 코테에서 특히 중요한 자료구조들이다.

2. 자료구조 공부 방법

A. 위 목록의 자료구조들을 순서대로 구글 블로그에서 찾아 따라 구현해본다.

a. 한두 번 정도 집중해서 따라쳐 보면서, 내부 작동 원리를 파악한다.

b. 특히 멤버변수로 무엇이 선언되었는지, 어떤 메소드를 포함하고 있는지는 암기에 가깝게 파악해야한다.

B. 한 유형의 자료구조를 따라치면서 파악했다면(암기X), 바로 백준 온라인 저지에서 해당 자료구조의 문제를 푼다.

a. https://www.acmicpc.net/problemset?sort=ac_desc&algo=175

b. 가장 기본적인 ‘스택, 큐’ 등의 이름이 붙은 문제를 풀면 된다. 사실상 해당 자료구조를 구현하는 문제이다.

하지만 암기까지 된 것은 아니기 때문에 잘 안 될 것이다 .

괜찮다. 다시 따라 구현하면서 문제를 해결하자.

c. 이제 해당 자료구조를 이용해서 푸는 문제로 보이는 것들을 골라서 풀기 시작한다.

이때부터는 구현된 코드를 보면서 풀면 안 된다. 암기해서 풀어야 한다 .

개인차는 있겠지만 10 문제 내외 풀다보면 입맛에 맞게 자료구조를 변형해서 문제를 풀고 있는 자신을 발견한다.

C. 자바의 경우 Array, ArrayList, HashMap, HashSet 등을 문제에서 직접 구현해서 쓰는 경우는 많이 없는

것 같다. 다만 이들의 내부 작동원리나 거기에 포함된 개념들은 매우 중요하기 때문에 반드시 공부해놔야 한다.

https://d2.naver.com/helloworld/831311

1. 알고리즘 공부 순서

A. Big-O 표기법

—————————————————————-

B. 정렬

a. slow: 선택정렬, 삽입정렬, 버블정렬

b. fast: 합병정렬, 퀵 정렬, 힙 정렬

C. String (문자열)

—————————————————————-

D. Exhaustive Search (완전탐색, Brute Force Search)

E. Greedy (탐욕법)

F. Divide and Conquer (분할 정복)

—————————————————————-

G. Recursion (재귀)

H. DFS, BFS (깊이우선탐색, 너비우선탐색)

I. Dynamic Programming (DP, 동적프로그래밍)

J. Backtracking

2. 알고리즘 공부 방법

A. 우선 A그룹의 ‘big-O 표기법’은 공부해야 한다.

a. 면접에서 big-O 표기법의 개념에 대해 묻거나, big-O를 고려한 문제풀이를 요구할 수 있기 때문이다.

B. B그룹의 문자열은 문제를 정말 많이 풀어보자. 정렬은 요즘 입사 코딩테스트에 잘 안 나온다고 하더라…

a. 문자열 문제는 닥치는대로 풀어라 .

보통 첫번째 문제는 지원자의 간도 좀 보고, 긴장도 풀어줄 겸 문자열 문제를 주는 경우가 많다.

여기서 버벅대면 시험의 리듬을 되찾기 힘들다.

char, char[], String, String[], StringBuilder 등의 개념, 사용법, 캐스팅 정도는 손가락이 기억하고 해내야 한다.

b. 정렬은 한두 번쯤 구현을 따라해보며 내부 작동원리를 파악해놓을 필요는 있을 것 같다.

C. C그룹은 제어문만 가지고도 문제를 해결할 수 있는 알고리즘 그룹이다.

a. 완전탐색은 개인적으로 중요하다고 생각한다.

일단 컴퓨터의 연산 능력에 대한 감을 익힐 수 있기 때문이다.

따라서 big-O 표기법에 따른 각 문제 해결 전략의 효율성을 가늠해볼 수 있는 지표로서의 역할을 한다.

또한 문제의 풀이 방법이 잘 생각나지 않을 때, 완전탐색의 접근법으로 풀려고 하다보면 적합한 알고리즘이 생각날 때도 있다.

b. C그룹을 공부하려니 지겨워서 자꾸 텐션이 떨어지는 느낌이 든다면 C그룹을 건너뛰고 D그룹을 먼저 공부할 것을 추천한다.

D. 컴퓨팅적 사고력의 꽃, 재귀

a. 일단 지나가는 문제 중 절반은 재귀의 개념에 기초한 알고리즘으로 풀어내는 것 같다.

다시 말하면, 재귀가 익숙하지 않으면 문제를 효율적으로 풀어낼 알고리즘을 익힐 수 없다 는 뜻이다.

그런데 보통 사람이라면 아주 기초적인 재귀의 풀이결과도 이해가 안 될 것이다.

그건 당연한 것이니 너무 실망하지 않아도 된다.

b. (재귀 접근 팁)

재귀를 이용한 풀이를 따라가다보면 뭔가 결론이 나기도 전에 자기 또는 다른 함수를 호출해버린다.

그래서 그걸 쫓아가면 머리가 과부하된 채로 길을 잃는다.

이때는 다음의 순서로 문제를 파악해본다.

1. 문제가 해결되는 과정을 머릿 속에 그려보고 비슷한 작업이 반복 되는 것을 발견한다.

2. 한 작업과 이어지는 작업이 어떤 유사성 을 갖는지 파악한다.

3. 유사성을 파악했다면 그 작업의 ‘끝’으로 간다 .

4. 사건들의 끝에서 작업할 내용과 반환할 내용 을 생각하여 재귀 호출을 끝낸다.

5. 다시 앞으로 가서, 각 작업들에서 작업할 내용 과 다음 작업에 넘겨줄 내용 을 생각하여 재귀적으로 호출한다.

c. 기초적인 재귀 함수의 감을 잡는 데에는 ‘트리 순회’, ‘피보나치 수열’, ‘팩토리얼’의 구현을 따라해보자.

d. 그 이후에 백준 온라인 저지에서 ‘하노이 탑 이동 순서(11729)’, ‘별 찍기 – 10(2447)’ 등을 풀어보면 된다.

e. 흐름을 하나하나 통제하려고 하지 말고, 구조를 만드는 것에만 집중하고 그 구조를 신뢰 해주면 쉽게 감이 잡힐 것이다.

어차피 잘못된 구조라면 원하는 결과가 나오지 않을테니 그때가서 흐름을 보고 구조를 손봐주면 된다

f. DFS, BFS, DP, Backtracking 등의 알고리즘은 해당 알고리즘을 잘 설명해놓은 블로그 찾아보고 관련된 기초

문제부터 풀면 된다. 얘네는 끝이 없는 것 같다.

[참고하면 좋은 글]

https://baactree.tistory.com/52

https://qkqhxla1.tistory.com/990

※ 알고리즘 초보가 나름대로 파악한 공부법입니다. 틀린 사실이 있거나 보완할 내용이 있다면 지적해주시면 3대가 흥할 것입니다.

키워드에 대한 정보 알고리즘 공부

다음은 Bing에서 알고리즘 공부 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 개발자라면 \”무조건\” 알고리즘 공부를 해야할까?

  • 코딩
  • 프로그래밍

개발자라면 #\”무조건\” #알고리즘 #공부를 #해야할까?


YouTube에서 알고리즘 공부 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 개발자라면 \”무조건\” 알고리즘 공부를 해야할까? | 알고리즘 공부, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

Leave a Comment