2018.06.27 제 5회 마스터즈 오픈 세미나(코드 스쿼드) Review
제 5회 마스터즈 오픈 세미나, 코드 스쿼드
첫 번째 세션 : 취미로 하는 알고리즘 문제 풀이, 40분 (남현욱, Reality Reflection)
- 중학교 2학년 때 처음으로 알고리즘 문제 풀이 접함
- 고등학교 절업 후 한동안 안 하다가, 1~2년 전쯤 다시 시작
- 주로 jwvg0425라는 아이디로 활동
- 문제 풀이를 좋아하지만 잘하는 건 아니다.
- 알고리즘 문제를 잘 푸는 법이 아니라 알고리즘 문제 풀이를 즐기는 법 위주의 얘기
알고리즘 문제 풀이
- 흔히, 요구사항이 굉장히 명확하게 정해져 있는 프로그램을 구현하는 것을 문제 풀이(Problem Solving, PS)라고 한다.
- 이런 문제들은 현실 세게에서 마주치는 문제들과 좀 다르다. 왜냐하면,
- 무엇을 입력받고 무엇을 출력해야 하는 지가 굉장히 명확하며
- 정해진 범위, 조건의 입력만 주어지고,
- 내가 만든 프로그램이 잘 동작하는 지 바로 확인할 수 있기 때문
알고리즘 문제 푸는 게 실제 개발에 도움이 되나요?
- 개인적인 생각으로는, 분명히 실제 개발에 도움이 되긴 하다.
- 하지만, 쏟는 시간 대비 효율은 별로
- 개발이 잘하고 싶다면 관련된 공부를 하는 게 더 빨리 실력이 늘 것
- 앞서 말한 것처럼, 문제 풀이에서 접하는 문제들은 거의 대부분 현업에서 해결해야 하는 문제와 크게 관련이 없기 때문
- 근데 왜 그런 걸 열심히 하나요?
- 그냥 재밌어서 한다.
문제 풀이 시작하기
- 그래서, 문제 풀이를 어떻게 시작하면 좋을까요?
- Online judge
- 책
- 대회
Online judge
- 알고리즘 문제를 풀 수 있는 사이트
- 입문 시 하나씩 풀어보면서 입문하면 좋다.
- 개인적으로는 Baekjoon online judge 추천
- 일단 문제가 굉장히 많고, 사용 가능한 언어도 다양하기 때문.
- 면접 준비 관련으로는 보통 leetcode를 많이 추천한다.
- 주의해야 할 점 ) 문제가 난이도 순으로 배치되어 있지 않다.
- 따라서 추천하는 방법 : 내가 못 푼 문제에 들어가면 안 푼 문제 중 가장 푼 사람 수가 많은 문제부터 순서대로 볼 수 있다.
- 혹은,
라는 사이트에서 자신의 아이디를 입력하면 자신이 푼 문제를 바탕으로 다음에 풀기 좋은 문제들을 추천받을 수 있다.
책
- 문제를 풀다 보면 모르는 알고리즘 / 자료구조를 써야만 풀 수 있는 문제들이 있다. 이런 문제들은 보통 혼자 고민하는 거로는 절대 풀 수 없기 때문에, 기반 지식을 먼저 익혀야 한다.
- 알고리즘 문제 해결 전략(구종만 저)
- 책에 나온 문제는 어려움, 이론을 공부하고 백준에서 문제 풀기를 추천.
- 알고리즘 문제 해결 전략 1권으로 충분
- dynamic programming, 탐색 등 쉬운 것 부터 시작.
-
(어려운 알고리즘 정리 잘해 놨음!)
- 알고리즘 문제 해결 전략(구종만 저)
대회
- 보통 문제를 풀다 보면 좀 질리는 순간이 온다.
- 개인적으로는 이럴 때 인터넷에서 개최하는 대회에 참가하는 게 큰 동기부여가 됐다.
- codeforces
- Google Codejam
- Atcoder
- Topcoder
- CS Academy
- Leetcode
- …
- 이런 사이트들의 특징은 대회를 치르고 나면 그 대회에서의 성적에 따라 레이팅을 부여받는다.
- 그리고 이 레이팅에 따라 보통 아이디의 색깔이 바뀐다.
- 레이팅에 따른 아이디 색깔 변화를 백준에 연동할 수 있다. (Topcoder, codeforces의 경우)
- Atcoder(일본 사이트, 참가하기 편한 시간대에 대회가 열림 보통 토요일 혹은 일요일 밤 9시~11시쯤까지 대회가 진행
- 보통 세 종류의 대회가 정기적으로 열린다.
- codeforces ( 시간대 괴장히 다양함, 유저가 가장 많은 것 같음)
- 문제 퀄리티가 좀 왔다 갔다 + 서버가 대회 중에 터지는 사태가 자주 발생
- 그럼에도 불구하고 이용자 수가 가장 많고 대회가 자주 열려서 많이 사용
문제풀이를 하면서 모르는 알고리즘 / 자료구조는 책으로 확인하고 지루할 쯤에 대회를 나가서 동기부여를 받는다.
- https://www.acmicpc.net/calendar : 백준에서 관리하는 대회 일정 캘린더
문제 풀이의 재미
- 독특한 발상은 떠올리는 과정 자체가 재미
- 어떻게 해도 O(N^2)으로 밖에 못 풀 것 같은 문제를 최적화해서 O(NlogN)으로 만들어 쓸 때의 쾌감
- 대회 시간 1분 남겨놓고 맞았을 때
- 원래 목표로 했던 레이팅에 도달했을 때 (원하는 아이디 색깔을 가지게 됐을 떄)
- …
- 하지만, 앞서 적은 상황들에서 전혀 재미를 느끼지 못하는 사람도 있다.
- 그냥 성향의 차이라고 생각하고, 만약에 문제를 좀 풀어도 보고 공부도 해봤는데 재미가 없다면, 굳이 억지로 할 필요는 없다고 생각
- 알고리즘과 실제 개발과 관련이 없다고 생각한다.
Q&A
- 문제를 풀다가 안 풀리는 문제가 생기면 어떻게 하나?
- 2시간 정도 고민해서 안 풀리면 풀이를 찾아본다.
- 찾아보고 풀 수 있는 거면 풀고 전혀 풀 수 없는 거면 보류, 나중에 또 보면 된다.
- javascript 로 쓰인 알고리즘 책 추천
- 보통 알고리즘 문제는 cpu 속도가 중요하기 떄문에 javascript 보단 c++과 같은 language가 많이 쓰인다.
- 알고리즘 하기 전에 자료구조 등을 공부해야하는가?
- 문제를 풀면서 모르는 게 생기면 풀이를 보고 풀이에서 모르는 게 있으면 찾아서 공부하고
두 번째 세션 : 자료구조 실무에서 어디까지 알아야 할까? (정호영, 코드스쿼드)
- 좋아하는 것
- 가족, 게임, 코딩, 운동, 독서 좋아해도 잘하진 못함
- 오늘 하고 싶은 이야기
- 자료구조와 알고리즘 왜 공부할까?
- 어떻게 해야 잘 할 수 있을까?
개발자가 알아야 하는 것들?
- 컴퓨터 과학 / 공학
- 이산수학, 선형대수, 확률통계, 자료구조, 알고리즘
- 네트워크(HTTP), 데이터베이스, 시스템 프로그래밍, 운영체제, 컴퓨터 구조
- 프로그래밍 언어론, 컴파일러
- 프로그래밍
- Java, C, C++, Python, C#, JS, SQL, ObjC, Swift, 한국어
- 프레임워크
- Spring, Android, React, Django, rails, html, css, git, github …
- 독서, 영어, 운동, 멘탈과 사람 관리
- 요즘은 프레임워크를 많이 공부하지만 프로그래밍 언어 자체를 공부하면 좋다.
- Web Develpoer in 2018, github에 있는 roadmap에도 보면 자료구조와 알고리즘이 들어있다.
알고리즘 왜 공부하나요?
- 알고리즘 테스트를 통과하려고(현실적인 이유)
- 중요하다고 해서
규모와 확장성!
중요한 것들
- 1.점근적 분석
- Big O
- Theta
- Omega
- 2.자료구조
- 배열, 리스트, 링크드 리스트, 트리, 그래프, …
- 실제 회사에서 배열, 리스트, 해시맵이면 99% 다 만들어짐…
- 면접을 위해 공부
- 3.프로그래밍
- 재귀, 함수형 프로그래밍
- 4.전략
- 알고리즘 문제 : 다이나믹 프로그래밍(중요), 분할 정복
- 현실 세계에서 쓰기 좋음 : 탐욕 알고리즘, 휴리스틱, 몬태카를로, …
- 팁
- 무언가가 재밌어지려면 ? 많은 시간을 투자하면 재밌어진다.
- 이유는 ? 남들보다 잘하니깐
자료구조는 왜 공부하나요?
- 문제를 해결하는 첫 번째 단계 = 적절한 자료구조를 선택하는 것
- 잘못 고르면 시작부터 망한다.
sorting
- 자료구조와 알고리즘 시작하면 제일 먼저 공부함
- 대체 왜?
- 어떤 알고리즘을 알고 있나?
많이 사용하는 자료구조?
- 배열 or 리스트
- 해시맵(해시테이블, 딕셔너리, 오브젝트 … )
- —–넘사벽—–
- set
- 그래프
- 트리
C언어
- 꼭 공부해야 하는지는 잘 모르겠다.
- 그런데 배워 놓으면 나쁘지는 않음
- 포인터, 메모리 구조
- C vs python vs JS vs Java
어떻게 공부해야 하나
- 무조건 문제풀이만 하는 건 좋지 않다
- 그래도 많이 풀어봐야 한다
- 가볍고 쉬운 것부터 공부하자
- 자료구조 먼저 공부하고 알고리즘 공부
- 여러 번 반복하기
- 병렬 학습 <- 추천 방법, 알고리즘 1번, 자료구조 1번
- 포기해도 좋으니까 편안하게 (끈을 놓지만 않으면 된다. 하다가 쉬고 하다가 쉬고 해도 좋다!)
학습 예시
- 항목은 중요하지 않다.
- 매일 알고리즘 o 문제씩 풀기 (5일에 한문제…)
- programmers, BOJ, hackerrank, leetcode, codeforces
- 동영상 강의 시청
- 바보코딩
- 인프런 권오흠 교수님 강좌
- MIT OCW Introduction to Algorithm (강추 ..?)
- 학습일지 기록 (미래의 나를 위해서, 예전에 풀었는데 어디 갔지~?)
책
- 헬로코딩(그림으로 이해나는 알고리즘)
- 누워서 읽는 알고리즘 (임백준)
- 예제코드 C언어
- 윤성우 자료구조
- 오류 투성이..? 그래도 초보자가 읽기엔 괜찮음.
- 자료구조(천인국)
- 무난하게 볼 수 있다.
- 프로그래밍 대회에서 배우는 알고리즘 문제 해결 전략 1
- Introduction to Algorithms
- Art of Programming
- 지구인 중에 다 읽은 사람 본 적 없다.ㅎㅎ
결론
- 꾸준하게 하자.
- 병렬로 학습하자. (뇌가 덜 피로)
- 중간에 포기해도 괜찮다, 멘탈 회복하고 나중에 다시 도전하자
- 알고리즘이라는 것은 어차피 대부분 개발자에겐 평생 빚
- 기초 서적 두 권, 동영상 강의 두 개 정도는 꼭 학습하자! ( 문제를 풀면서 짬짬이)
- 여담
- 지인 구글 들어가신 분
- 수학의 정석 -> 문제풀이 & 프로그래밍 대회에서 배우는 알고리즘 문제 해결 전략으로 공부(이것만 봐도 충분하다.)
- 지인 구글 들어가신 분
후기
- 자료구조 / 알고리즘 항상 중요하다고 하지만 실제로 어떻게 시작해야 할지 막연한 주제였는데 이번 세미나를 통해서 조금이나마 해소할 수 있었다.
- 문제풀이 사이트, 책, 대회 등 많은 정보를 얻게 되어 이제 실천만 하면 된다고 생각한다.
- 정호영 님이 말씀하신 것처럼 병렬로 꾸준히 학습을 진행 해봐야 겠다!
- 좋은 정보 공유해주신 발표자분들께 너무 감사합니다 :)