-
3.3 자주 하는 실수에 관하여 (2)알고리즘 [Study] 2020. 5. 7. 22:32
- 이 블로그 내의 모든 내용은 알고리즘 문제 해결 전략 (저 구동만 출판: 인사이트) 내용을 요약한 것입니다.
- 제가 이해한 대로 정리한 내용이기에 본문의 내용과 상이할 수 있습니다.
3-1 장에 이어 자주하는 실수에 대해서 이어 정리해보겠습니다.
- 컴파일러가 잡아주지 못하는 상수 오타
1) 전부 대문자로 써야하는데 첫 글자만 대문자로 쓰는 경우
2) 0의 개수를 잘못 쓰는 경우
3) 자료형을 문제에 맞게 변경하지 않는 경우 - 스택 오버플로
1) 콜 스택(call stack)이 오버플로해서 프로그램이 강제 종료 되는 경우 ( 스택 허용량에 대해 알아 둘 필요가 있다)
2) 배열 등 큰 지역 변수를 스택에 잡으면 재귀 호출이 없어도 곧장 스택 오버플로가 나기 쉽다.
3) 자동으로 힙에 메모리를 할당하는 STL 컨테이너를 사용하거나 전역 변수를 사용하자 - 다차원 배열 인덱스 순서 바꿔 쓰기
1) 다차원 배열에서 인덱스의 순서를 헷갈려서 잘못쓰는 경우
2) 동적 계획법을 위한 메모이제이션 패턴을 사용할 때 자주 실수함 (8장에서 다룬다)
3) 한 특정 배열에 접근하는 위치를 하나로 통일하는 것이 좋다 - 잘못된 비교 함수 작성
1) 크기 비교, 사전순 비교만을 사용하더라도 충분한 문제에 복잡한 비교 함수를 작성하는 경우
2) C++, 자바, 파이썬 등 표준 라이브러리가 다르므로 < 연산 대신에 <= 연산을 비교 함수 모델로 쓰는 경우
* 자신이 사용하는 표준라이브러리가 어떠한 기준을 갖는지 명확히 알 필요가 있다!! - 최소, 최대 예외 잘못 다루기
1) 최소 값과 최대 값이 예외가 되는 문제들이 많다, 코드를 짤 때 가장 작은 입력과 가장 큰 입력에 대해 제대로 동작할지를 생각해보자
ex) 소수 찾기 문제에서 1을 예외처리 해야하는 경우 - 연산자 우선순위 잘못 쓰기
1) 연산자 우선순위는 종종 잡기 힘든 버그를 만들곤 한다.
if(b & i == 0)
이 if 문을 보면 1==0 이 우선이지만 b & i 가 우선인 것처럼 착각할 수도 있다. (괄호를 적극 사용하자!)
- 너무 느린 입출력 방식 선택
대부분의 프로그래밍 언어에서는 입출력 할 수 있는 다양한 방법을 제공한다.
사용하는 언어에서 어떠한 입출력 방식이 빠른지 확인하고 미리 익혀두자
파이썬에서는 input() 말고 sys.stdin.readline() 를 사용하자.
결론만 말하자면, 입출력 속도가 다음과 같다.
sys.stdin.readline() > raw_input() > input()
뭐 어느정도로 더 빠르고 느리냐는, 코딩 테스트 문제푸는 수준에서 다룰만한 내용이 아니므로 넘어가도록 하고, 직관적으로만 느꼈던 것은, input() 으로 코드를 제출할 시, 시간초과가 뜨지만, sys.stdin.readline() 으로 제출할 시 정답이 뜨더라는 것이다. 이와 비슷한 이슈는 이미 이전부터 있었다.
글 읽기 - input()과 sys.stdin.readline()의 차이점이 뭔가요??
댓글을 작성하려면 로그인해야 합니다.
www.acmicpc.net
- 변수 초기화 문제
1) 입력에서 사용한 전역 변수 값을 초기화하지 않고 그대로 사용하는 경우
2) 대부분이 예제문제에서 걸러지지만 그러지 않을 때도 있으므로 적절히 초기화하도록 신경 써서 코딩하자
'알고리즘 [Study]' 카테고리의 다른 글
프로그래머스 쇠막대기 파이썬 문제풀이 (level2) (0) 2020.06.03 3.5 변수 범위의 이해 ( 산술 오버플로) (0) 2020.05.12 3.3 자주 하는 실수에 관하여 (1) (0) 2020.05.06 알고리즘 문제 해결 전략 정리 (0) 2020.04.29