목록알고리즘 문제 풀이/프로그래밍 대회에서 배우는 알고리즘 문제 해결 전략 (4)
Vienna
같은 실수를 반복하기보다는 실수에서 배우는 것이 좋고, 그보다 더 좋은 것은 남의 실수로부터 배워 유사한 실수를 저지르지 않는 것이다. ◇ 프로그래밍 대회에 참가한 사람들이 흔히 저지르는 실수 중 대표적인 것 ◆ 산술 오버플로 변수의 표현 범위를 벗어나는 값을 사용하는 경우. ◆ 배열 범위 밖 원소에 접근 이 실수를 예방하는 가장 좋은 방법은 (당연하게도) 배열의 크기를 정할 때 계산을 신중하게 하는 것. ◆ 일관되지 않은 범위 표현 방식 사용하기 배열의 잘못된 위치를 참조하는 오류가 발생하는 큰 원인 중 하나. 프로그램 내에서 범위의 표현 방식으로 *닫힌 구간과 **열린 구간을 섞어 쓰는 경우가 있다. *닫힌 구간: 양 끝의 경계를 포함하는 구간 **열린 구간: 양 끝의 경계를 포함하지 않는 구간 대부..
◇ 코딩의 중요성을 간과하지 말 것. 프로그래밍 대회에서 좋은 성적을 올리기 위한 비결은 읽기 쉬운 코드를 작성하는 것이다. ◇ 좋은 코드를 짜기 위한 원칙 일반적으로 실무에서 좋은 코드의 원칙이라고 할만한 것들 또한 대부분 프로그래밍 대회에도 적용된다. ◆ 간결한 코드 작성하기 코드가 짧을수록 오타나 단순한 버그가 생길 우려가 줄어들고, 디버깅도 쉬워지기 때문. 하지만 프로그래밍 대회에서 사용이 권장되는 방식은 다음과 같다. 전역 변수의 광범위한 사용 C/C++의 매크로 사용 Java 및 C#의 foreach 구문 사용. 회사에서 내가 사용하는 C#의 경우 foreach를 사용할 때 그냥 for문에 비해 GC가 더 많이 불리기 때문에 실제로 잘 사용하지 않고 있지 않다. ◆ 적극적으로 코드 재사용하기 ..
◇ 직관과 체계적인 접근 문제 해결 전략에서 문제와 답의 구조에 대한 *직관을 강조해야 한다. * 해당 문제를 해결하는 알고리즘이 대략적으로 어떤 형태를 가질지를 짐작할 수 있게 해준다. ◇ 체계적인 접근을 위한 질문들 ◆ 비슷한 문제를 풀어본 적이 있던가? 이전에 사용했던 방법과 비슷한 접근 방법을 사용할 것이라 예측할 수 있다. 문제를 분류하는 방법을 익히고, 각 알고리즘들이 어떤 경우에 사용될 수 있는지 체계적으로 공부해야 한다. 즉, 그 동작 과정과 원리를 완전히 이해하고 있어야 한다. ◆ 단순한 방법에서 시작할 수 있을까? 일단 시간과 공간 제약을 생각하지 않고 문제를 해결할 수 있는 가장 단순한 알고리즘을 만들어 보는 것도 괜찮다. => 어렵게 푸는 실수를 예방! ◆ 내가 문제를 푸는 과정을 ..
◇ How to solve it? 문제를 읽고 이해한다. 문제 설명을 공격적으로 읽으며 문제가 원하는 바를 완전히 이해하는 과정이 반드시 필요하다. 문제를 익숙한 용어로 재정의한다. 자신이 다루기 쉬운 개념을 이용해서, 문제를 자신의 언어로 풀어 쓰는 것. 추상화: 현실 세계의 개념을 우리가 다루기 쉬운 수학적/전산학적 개념으로 옮겨 표현하는 과정 문제의 본질을 어떤 방식으로 재구성하느냐에 따라 같은 일을 하는 프로그램이라도 전혀 다른 방향으로 접근하게 된다. 어떻게 풀지 계획을 세운다. 문제를 어떤 방식으로 해결할 것인가? 사용할 알고리즘과 자료구조를 선택 계획을 검증한다. 설계한 알고리즘이 모든 경우에 요구 조건을 정확히 수행하는지를 증명 수행에 걸리는 시간과 사용하는 메모리가 문제의 제한 내에 들어..