제 5회 마스터즈 오픈 세미나(코드 스쿼드) 후기

2018.06.27 제 5회 마스터즈 오픈 세미나(코드 스쿼드) Review


제 5회 마스터즈 오픈 세미나, 코드 스쿼드

codesquadSeminar

첫 번째 세션 : 취미로 하는 알고리즘 문제 풀이, 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

  • 자료구조와 알고리즘 시작하면 제일 먼저 공부함
  • 대체 왜?
  • 어떤 알고리즘을 알고 있나?

많이 사용하는 자료구조?

  1. 배열 or 리스트
  2. 해시맵(해시테이블, 딕셔너리, 오브젝트 … )
    • —–넘사벽—–
  3. set
  4. 그래프
  5. 트리

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
    • 지구인 중에 다 읽은 사람 본 적 없다.ㅎㅎ

결론

  • 꾸준하게 하자.
  • 병렬로 학습하자. (뇌가 덜 피로)
  • 중간에 포기해도 괜찮다, 멘탈 회복하고 나중에 다시 도전하자
  • 알고리즘이라는 것은 어차피 대부분 개발자에겐 평생 빚
  • 기초 서적 두 권, 동영상 강의 두 개 정도는 꼭 학습하자! ( 문제를 풀면서 짬짬이)
  • 여담
    • 지인 구글 들어가신 분
      • 수학의 정석 -> 문제풀이 & 프로그래밍 대회에서 배우는 알고리즘 문제 해결 전략으로 공부(이것만 봐도 충분하다.)

후기

  • 자료구조 / 알고리즘 항상 중요하다고 하지만 실제로 어떻게 시작해야 할지 막연한 주제였는데 이번 세미나를 통해서 조금이나마 해소할 수 있었다.
  • 문제풀이 사이트, 책, 대회 등 많은 정보를 얻게 되어 이제 실천만 하면 된다고 생각한다.
  • 정호영 님이 말씀하신 것처럼 병렬로 꾸준히 학습을 진행 해봐야 겠다!
  • 좋은 정보 공유해주신 발표자분들께 너무 감사합니다 :)
facebook share twitter share
0%