[알고리즘 문제 해결 전략] 01 문제 해결과 프로그래밍 대회

Daniel Oh·2023년 10월 29일
0
post-thumbnail

책을 읽으며 기록합니다.

개관

유수의 대학에서 컴퓨터를 전공하고도 코드 한 줄 못 짜는 사람들은 넘쳐남. 프로그래밍은 참 어려움.

이 현상의 근본적인 이유는 대부분 컴퓨터 교육 과정이 프로그래밍의 기술과 지식을 가르칠 뿐, 그것을 스스로 응용할 수 있는 능력을 주지는 못하기 때문임.

이는 컴퓨터 과학 교육이 실제 학문이 발전하는 방향의 반대 순서로 이루어져 있기 때문!

실제 학문이 발전하는 방향: 학자들의 직관 -> 시행착오 & 경험으로 학문의 기초가 됨 -> 공리와 법칙을 만들고 학문의 체계를 정리해 나감
컴퓨터 과학 교육: 최종 결과물인 복잡한 개념과 도구 제시 -> 개념의 이론 설명 -> 연습 문제 풀기 (해당 과정에서 이론을 만들기 위한 직관과 경험적 요소는 배제됨)

직관과 경험적 요소를 얻는 가장 좋은 방법 = 프로그래밍 대회 문제 풀기! (PS)

01 문제 해결과 프로그래밍 대회

1.1 도입: 좋은 개발자란 무엇인가?

프로그래밍은 문제 해결임. 따라서 많은 제약 조건과 요구사항을 이해하고 최선의 방법을 찾아내는 능력은 분야를 막론하고 좋은 개발자가 되기 위해 필수적임.

많은 제약 조건과 요구사항을 이해하고 최선의 방법을 찾아내는 능력 = 문제 해결 능력

문제 해결 능력을 훈련하는 방법은?

1.2 프로그래밍 대회

바로 프로그래밍 대회에 참가하는 것! 프로그래밍 대회란, 짧은 요구사항을 제시하고, 이에 맞는 프로그램을 시간 안에 빠르게 작성하는 능력을 겨루는 대회를 말함.

프로그래밍 대회에서 배울 수 있는 것

  1. 입출력이 텍스트 파일이기 때문에 군더더기가 없어 참가자는 문제를 해결하는 데에만 집중할 수 있음.
  2. 명시적인 시간 제한과 메로리 제한이 있음. 따라서 참가자는 제약 안에서 문제를 해결할 수 있는 알고리즘을 신중하게 설계해야 하고, 다양한 알고리즘 설계 기법과 자료 구조를 직접 사용해 볼 수 있는 계기가 됨. 또 변형도 많이되어 주제를 깊이 이해할 수 있음.
  3. 정답과 오답의 여부가 현업 문제 해결에 비해 훨씬 명확하게 가려짐.
  4. 제출한 프로그램의 실행 시간, 메모리 사용량 관련 정보가 실시간으로 제공되기에, 프로그램을 고쳐 가며 작은 변경이 프로그램의 효율성에 미치는 영향을 직접 체험해 볼 수 있음.
  5. 규모가 작아 각 문제를 풀 때마다 처음부터 다시 짜게 되는데, 이런 특성은 평소 대형 프로젝트에서 간과했던 작은 부분에 집중할 수 있게 도와줌. 이는 간결하면서 우아한 코드를 짜는데 시간을 투자할 수 있으므로, 좋은 코드를 짜기 위한 연습이 됨.
  6. 전세계의 고수 프로그래머들이 짠 코드를 직접 보고 자신이 짠 코드와 비교해볼 수 있음.

1.3 이 책을 읽는 방법

이 책의 구성

7부 = 1~2부 (필요한 기본 지식) + 3~7부 (문제 해결에 필요한 기술)

이책의 연습 문제들은 모두 알고스팟에서 채점 받을 수 있음.

필요한 배경 지식

컴퓨터 과학을 전공하는 학부생을 주 독자층으로 가정. 고등학교 수학 과정을 이수했으며 C++과 STL을 사용할 수 있다면 충분함.

입문자를 위한 권장 사항

2, 3, 4, 6, 7, 8, 18, 19, 21, 22, 23, 27, 28, 29, 30 순서로 가장 중요하고 기초적인 주제만을 우선 소화한 후, 다시 읽으며 빈 곳을 메꿔가기.

1.4 국내에서 참가할 수 있는 프로그래밍 대회

  • 한국 정보 올림피아드
  • ACM-ICPC (ACM 대학생 프로그래밍 경시대회)
  • 탑코더 (TopCoder)
  • 구글 코드 잼 (Google Code Jam)
  • 기타 온라인 대회와 모의고사들

1.5 대회 준비를 위한 조언

가능한 많은 문제 풀기

대회에 필요한 주제들은 엄청 많음. 따라서 막 이것 저것 푸는 경우가 많음. 하지만 복잡한 알고리즘을 하나 더 아는 것보다 실제로 자신이 아는 것을 이용해 문제를 풀 수 있는 능력이 훨씬 중요함. 따라서 제대로, 많이 풀며 경험을 쌓는 것이 중요함.

온라인 채점 사이트 이용하기

채점 사이트 이용해서 자신이 제대로 풀고 있는지를 확인하기.

가능한 한 많은 프로그래밍 대회에 참가하기

혼자서 문제를 푸는 것보다 훨씬 많은 도움과 자극이 됨.

팀 단위 연습을 위한 조언

  • 종이 위에 답안 스케치하기
  • 치밀한 역할 분담
  • 페어 프로그래밍 연습하기
  • 디버거 없이 디버깅하기
  • 인쇄 대기 감소를 위한 두 화면 분할

팀 노트북 준비하기

  • 미리미리 준비하기
  • 간단한 형태의 문서화
  • 클래스 형태로 준비하기
  • 적절한 글꼴 선택하기

1.6 더 읽을거리

  • Introduction to Algorithm (한빛미디어)
  • Programming Challenges (한빛미디어)
  • The Art of Computer Programming (한빛미디어)
  • 프로그래밍 콘테스트 챌린징 (로드북)
profile
안녕하세요. 오도열입니다.

0개의 댓글