목록알고리즘/Algorithmic Problem Solving Strategies (13)
레야몬

변수 범위의 이해 너무 큰 결과 32비트 자료형의 범위를 넘어가면 64비트 자료형을 사용하면 되지만 64비트 자료형을 전달하는 과정에서 32비트 자료형을 사용하는 실수를 범하기 쉬우므로 조심하자. 너무 큰 중간 값 변수들의 크기는 작지면, 곱하거나, 제곱하는 과정에서 오버플로우가 일어날 수 있으므로 조심해야 한다. 너무 큰 '무한대' 값 INF값을 사용할 때 더하거나 곱하는 과정에서 오버플로우가 날 수 있으므로 조심해야 한다. INF는 987654321로 하는 것을 추천한다. 오버플로 피해 가기 오버플로가 발생하는 것을 알았을 때 이를 해결하는 방법은 여러 가지가 있다. 더 큰 자료형을 사용하는 방법(32비트 자료형 -> 64비트 자료형) 계산 순서를 바꾸는 방법( a*b/c -> a/c*b ) 계산 방..
자주 하는 실수 산술 오버플로 계산 과정에서 변수의 표현 범위를 벗어나는 값을 사용하는 산술 오버플로 배열 범위 밖 원소에 접근 배열의 범위를 벗어나는 위치의 값에 접근했을 경우 런타임 스택 등을 건드려서 런타임 에러가 날 경우 쉽게 발견할 수 있지만 int a[10], t;의 경우 a[10]에서 t의 값이 나오고 에러가 나지 않으므로 매우 찾기 어려운 버그가 될 수 있다. 따라서 배열의 범위를 정할 때 신중히 정하자. 일관되지 않은 범위 표현 방식 사용하기 닫힌 구간([a, b])를 사용할 경우 공집합을 표현하는 데에 부자연스러우며, 열린 구간(a, b)를 사용할 경우 0부터 시작하려면 음수로 범위를 나타내어야 하므로 부자연스럽다. 따라서 컴퓨터에서는 반 열린 구간(half-open inteval)을 ..
좋은 코드를 짜기 위한 원칙 간결한 코드를 작성하기 코드를 간결하게 작성하면 디버깅하기도 편하고 코드의 구현이 명확해진다. 매크로를 사용하면 코드를 간결하게 바꿀 수 있다. for(int j=0; j FOR(j, i) 전역 변수를 사용하면 모든 함수에서 변수를 사용할 수 있기 때문에 편리하다. 단, 프로그래밍 대회에서 사용하는 코드는 간결하니 가능하지만 실무에서는 이렇게 사용하면 안 된다. 적극적으로 코드 재사용하기 재사용되는 코드가 있으면 함수로 만들어서 사용하는 것이 좋다. (디버깅하기 편리하다.) 표준 라이브러리 공부하기 표준 라이브러리를 사용하면 다른 사람이 코드를 볼 때 이해하기 쉬우며 이미 검증되어 있으므로 사용하기 편리하다. 항상 같은 형태로 프로그램을 작성하기 매번 알고리즘을 다양한 형태로..
문제 해결 과정 문제를 읽고 이해한다. 문제를 노트에 다시 써보면 문제를 제대로 이해하기 좋다. 문제를 익숙한 용어로 재정의한다. 여러 수식어가 붙어있는 문제를 간단한 문제로 축약시키면 문제를 이해하기 좋다. 어떻게 해결할지 계획을 세운다. 문제에서 어떤 알고리즘과 어떤 자료 구조를 사용할지를 결정한다. 계획을 검증한다. 사용할 알고리즘이 문제의 상황에 맞는지, 즉 메모리와 소요 시간이 적합한지 등을 확인한다. 프로그램으로 구현한다. 어떻게 풀었는지 돌아보고, 계선할 방법이 있는지 찾아본다. 문제의 해법을 찾는 데 결정적이었던 깨달음은 무엇이었는지, 문제를 풀면서 어려움을 겪었던 점은 무었이었는지를 기록하며 오답노트를 작성한다. 또 다른 사람이 쓴 코드를 보면 자신이 생각하지 못했던 통찰을 얻을 수도 있..

요즘 코딩 문제를 풀면서 벽을 느끼고 있다. class 문제를 계속 풀어나가던 도중 플래문제에 도달하게 되면서 문제가 어렵다는 생각을 많이 했다. class 6에 도달하고 나서 풀 수는 있지만 시간이 너무 오래걸렸고 이 문제들은 내 수준에 맞지 않는다는 생각이 들었다. 이전에도 이런 경험들이 많이 있었기 때문에 나는 어떻게 해야 할지 알 수 있었고 복습하는 것이 물론 더 오래 걸릴 것이지만 그래야만 한다는 것을 알 수 있었다. 지금까지는 알고리즘을 이해하고 코드를 써보는게 다였으나 그런 것들은 언제부턴가는 한계점이 온다는 사실을 알고 썼고 실제로 한계점에 도달했다. 체계적으로 배우지 못했고, 시간, 공간 복잡도, 원리, 엄밀성 등등을 따지지 않았기 때문에 그런 것들을 학습해야 된다고 생각했다. 그래서 책..